diff --git a/src/bin/g10.rs b/src/bin/g10.rs index 5b247b1..4d59d47 100644 --- a/src/bin/g10.rs +++ b/src/bin/g10.rs @@ -83,5 +83,5 @@ fn main() { println!( "parsed: {:?}", grammar.slr_parser(&mut m.iter_mut()).parse() - ) + ); } diff --git a/src/cfg/lr_parser.rs b/src/cfg/lr_parser.rs index c3b279b..d25bb24 100644 --- a/src/cfg/lr_parser.rs +++ b/src/cfg/lr_parser.rs @@ -110,13 +110,11 @@ where childs: childs.into_iter().rev().map(|(a, _)| a.clone()).collect(), }); } - let Some(state) = stack.last() else { - return Err("Unexpected EOS 2".into()); - }; - let Some(next) = self.get_goto(&state.1, rule) else { + let state = stack.last().map(|s| s.1).unwrap_or(self.parse_table.2); + let Some(next) = self.get_goto(&state, rule) else { return Err(format!( "Invalid reduction: state: {} rule: {:?}", - state.1, rule + state, rule )); }; stack.push(( diff --git a/src/main.rs b/src/main.rs index 7ba4c19..36b8fb0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,7 +197,7 @@ fn main() { //println!("follow: {:?}", grammar.follow); grammar.gen_lr1_automaton(); println!("conflict: {:?}", grammar.lr1_automaton); - /* let conflict = grammar.gen_ll_parse_table(); + let conflict = grammar.gen_ll_parse_table(); println!("conflict: {conflict}"); println!("prase table: {:?}", grammar.ll_parse_table); println!("parse\n\n"); @@ -207,5 +207,5 @@ fn main() { .ll_parser(&mut m.iter_mut()) .parse() .map(|tree| tree.clean()) - ) */ + ) }