From 6722fb4ff2e756f09d832997be988b7c56ada6e4 Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Tue, 9 Feb 2021 15:54:55 +0000 Subject: Rewrite `lalrpop` parser so it works. --- chomp-bench/src/json/lalr.lalrpop | 33 ++++++++++++++++++--------------- 1 file 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(<>), - "[" > "]" => Value::Array(<>), - "{" ":" )>> "}" => Value::Object(<>.into_iter().collect()), + "[" "]" => Value::Array(Vec::new()), + "[" ",")*> "]" => { + let mut v = v; + v.push(e); + Value::Array(v) + }, + "{" "}" => Value::Object(HashMap::new()), + "{" ":" ",")*> ":" )> "}" => { + 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: Vec = { - T? => <>.into_iter().collect(), - ",")+> => { - let mut v = v; - v.push(e); - v - } -} -- cgit v1.2.3