diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-05-01 17:37:21 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-05-01 17:42:08 +0200 |
commit | 704f45ae23caf2e83710f2aa4c17be24abe3f162 (patch) | |
tree | 2b409ed9d6010248431a02c55059558150a34f16 /crates | |
parent | 6bc96276479c276baef5bf7fea1077cb2f4d5f0b (diff) | |
download | rebel-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.rs | 7 |
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")) } |