summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-05-01 17:37:21 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-05-01 17:42:08 +0200
commit704f45ae23caf2e83710f2aa4c17be24abe3f162 (patch)
tree2b409ed9d6010248431a02c55059558150a34f16 /crates
parent6bc96276479c276baef5bf7fea1077cb2f4d5f0b (diff)
downloadrebel-704f45ae23caf2e83710f2aa4c17be24abe3f162.tar
rebel-704f45ae23caf2e83710f2aa4c17be24abe3f162.zip
rebel-parse: recipe: allow negative integer literals
Parsing a number as a negative literal instead of a positive number with negation fixes parsing of i64::MIN. The rule is only used for this specific case though, as the unary_op + number rule will succeed first otherwise.
Diffstat (limited to 'crates')
-rw-r--r--crates/rebel-parse/src/grammar/recipe.rs7
1 files changed, 5 insertions, 2 deletions
diff --git a/crates/rebel-parse/src/grammar/recipe.rs b/crates/rebel-parse/src/grammar/recipe.rs
index 2d342ad..5f6adbc 100644
--- a/crates/rebel-parse/src/grammar/recipe.rs
+++ b/crates/rebel-parse/src/grammar/recipe.rs
@@ -198,7 +198,7 @@ peg::parser! {
}
rule number() -> i64
- = [Token::Number(s)] { ?
+ = neg:p('-')? [Token::Number(s)] { ?
let (radix, rest) = if let Some(rest) = s.strip_prefix("0x") {
(16, rest)
} else if let Some(rest) = s.strip_prefix("0o") {
@@ -208,7 +208,10 @@ peg::parser! {
} else {
(10, *s)
};
- let digits = rest.replace('_', "");
+ let mut digits = rest.replace('_', "");
+ if neg.is_some() {
+ digits = format!("-{digits}");
+ }
i64::from_str_radix(&digits, radix).or(Err("number"))
}