low stack fix
This commit is contained in:
parent
3339bf8fb0
commit
3c741567df
3 changed files with 9 additions and 12 deletions
|
@ -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()
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,9 +78,7 @@ where
|
||||||
.unwrap_or("end of file".to_string())
|
.unwrap_or("end of file".to_string())
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
|
|
||||||
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((
|
||||||
|
|
|
@ -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())
|
||||||
) */
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue