diff options
author | Greg Brown <gmb60@cam.ac.uk> | 2021-02-09 15:54:55 +0000 |
---|---|---|
committer | Greg Brown <gmb60@cam.ac.uk> | 2021-02-09 15:54:55 +0000 |
commit | 6722fb4ff2e756f09d832997be988b7c56ada6e4 (patch) | |
tree | 20234c5afd546c9dfccd72370a4f47268220ef84 | |
parent | a1faa3688f37f0498b9569304bc13ec0f729db07 (diff) |
Rewrite `lalrpop` parser so it works.
-rw-r--r-- | chomp-bench/src/json/lalr.lalrpop | 33 |
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 - } -} |