summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Brown <gmb60@cam.ac.uk>2021-02-09 15:54:55 +0000
committerGreg Brown <gmb60@cam.ac.uk>2021-02-09 15:54:55 +0000
commit6722fb4ff2e756f09d832997be988b7c56ada6e4 (patch)
tree20234c5afd546c9dfccd72370a4f47268220ef84
parenta1faa3688f37f0498b9569304bc13ec0f729db07 (diff)
Rewrite `lalrpop` parser so it works.
-rw-r--r--chomp-bench/src/json/lalr.lalrpop33
1 files changed, 18 insertions, 15 deletions
diff --git a/chomp-bench/src/json/lalr.lalrpop b/chomp-bench/src/json/lalr.lalrpop
index 99f86ab..b5a8401 100644
--- a/chomp-bench/src/json/lalr.lalrpop
+++ b/chomp-bench/src/json/lalr.lalrpop
@@ -4,21 +4,33 @@ use std::{collections::HashMap, convert::TryInto, str::FromStr};
grammar;
-pub RawValue: Value = {
+pub Value: Value = {
"null" => Value::Null,
"true" => Value::Bool(true),
"false" => Value::Bool(false),
Num => Value::Number(<>),
Str => Value::String(<>),
- "[" <Comma<RawValue>> "]" => Value::Array(<>),
- "{" <Comma<(<Str> ":" <RawValue>)>> "}" => Value::Object(<>.into_iter().collect()),
+ "[" "]" => Value::Array(Vec::new()),
+ "[" <v : (<Value> ",")*> <e: Value> "]" => {
+ let mut v = v;
+ v.push(e);
+ Value::Array(v)
+ },
+ "{" "}" => Value::Object(HashMap::new()),
+ "{" <v : (<Str> ":" <Value> ",")*> <e : (<Str> ":" <Value>)> "}" => {
+ let mut v = v;
+ v.push(e);
+ Value::Object(v.into_iter().collect())
+ },
};
-pub Num: f64 = r"-?(0|[1-9][0-9]*)(\.[0-9]*)([eE][-+]?[0-9]+)" => f64::from_str(<>).unwrap();
+pub Num: f64 = r"-?(0|[1-9][0-9]*)(\.[0-9]*)?([eE][-+]?[0-9]+)?" => f64::from_str(<>).unwrap();
pub Str: String = r#""([^\\"]|\\.)*""# => {
let mut out = String::new();
let mut iter = <>.chars();
+ iter.next();
+ iter.next_back();
while let Some(c) = iter.next() {
let c = match c {
c @ '\x20'..='\x21' | c @ '\x23'..='\x5B' | c @ '\x5D'..='\u{10FFFF}' => c,
@@ -47,20 +59,11 @@ pub Str: String = r#""([^\\"]|\\.)*""# => {
};
codepoint.try_into().unwrap()
}
- _ => panic!(),
+ c => panic!("bad escape sequence {}", c),
}
- _ => panic!(),
+ c => panic!("invalid character {}", c),
};
out.push(c);
}
out
};
-
-Comma<T>: Vec<T> = {
- T? => <>.into_iter().collect(),
- <v : (<T> ",")+> <e : T> => {
- let mut v = v;
- v.push(e);
- v
- }
-}