low stack fix

This commit is contained in:
jusax23 2024-11-09 21:33:32 +01:00
parent 3339bf8fb0
commit 3c741567df
Signed by: jusax23
GPG key ID: 499E2AA870C1CD41
3 changed files with 9 additions and 12 deletions

View file

@ -79,9 +79,10 @@ fn main() {
println!("automaton: {:?}", grammar.lr1_automaton); println!("automaton: {:?}", grammar.lr1_automaton);
println!("conflict: {}", grammar.gen_slr_parse_table()); println!("conflict: {}", grammar.gen_slr_parse_table());
println!("conflict: {}", grammar.gen_lr1_parse_table()); println!("conflict: {}", grammar.gen_lr1_parse_table());
println!("parse_table: {:?}", grammar.lr1_automaton); println!("parse_table: {:?}", grammar.slr_parse_table.as_ref().unwrap().0.len());
println!("parse_table: {:?}", grammar.lr1_automaton.as_ref().unwrap().0.len());
println!( println!(
"parsed: {:?}", "parsed: {:?}",
grammar.slr_parser(&mut m.iter_mut()).parse() grammar.slr_parser(&mut m.iter_mut()).parse()
) );
} }

View file

@ -79,8 +79,6 @@ where
)); ));
}; };
println!("next: {next:?}, state: {current_state:?}, stack: {stack:?}");
match current_state { match current_state {
LrAction::Shift(to) => { LrAction::Shift(to) => {
stack.push((NodeChild::Data(next.expect("Can not shift on EOF.")), *to)); stack.push((NodeChild::Data(next.expect("Can not shift on EOF.")), *to));
@ -110,13 +108,11 @@ where
childs: childs.into_iter().rev().map(|(a, _)| a.clone()).collect(), childs: childs.into_iter().rev().map(|(a, _)| a.clone()).collect(),
}); });
} }
let Some(state) = stack.last() else { let state = stack.last().map(|s| s.1).unwrap_or(self.parse_table.2);
return Err("Unexpected EOS 2".into()); let Some(next) = self.get_goto(&state, rule) else {
};
let Some(next) = self.get_goto(&state.1, rule) else {
return Err(format!( return Err(format!(
"Invalid reduction: state: {} rule: {:?}", "Invalid reduction: state: {} rule: {:?}",
state.1, rule state, rule
)); ));
}; };
stack.push(( stack.push((

View file

@ -197,7 +197,7 @@ fn main() {
//println!("follow: {:?}", grammar.follow); //println!("follow: {:?}", grammar.follow);
grammar.gen_lr1_automaton(); grammar.gen_lr1_automaton();
println!("conflict: {:?}", grammar.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!("conflict: {conflict}");
println!("prase table: {:?}", grammar.ll_parse_table); println!("prase table: {:?}", grammar.ll_parse_table);
println!("parse\n\n"); println!("parse\n\n");
@ -207,5 +207,5 @@ fn main() {
.ll_parser(&mut m.iter_mut()) .ll_parser(&mut m.iter_mut())
.parse() .parse()
.map(|tree| tree.clean()) .map(|tree| tree.clean())
) */ )
} }