metrale_grammar/earley/
parser_api.rs1use super::parser::EarleyParser;
10use super::state::{NO_PREV_INPUT_POS, ParserState};
11
12impl EarleyParser {
13 pub fn pop_last_states(&mut self, count: usize) {
21 self.stop_token_is_accepted = false;
22 assert!(
23 (count as i32) < self.completable.len(),
24 "cannot pop {count} states: only {} recorded",
25 self.completable.len()
26 );
27 self.completable.pop_rows(count as i32);
31 self.is_completed.truncate(self.is_completed.len() - count);
32 self.scanable_history.pop_rows(count as i32);
33 }
34
35 pub fn push_state_and_expand(&mut self, state: ParserState) {
38 self.queue.clear_visited();
39 self.accept_stop_token = false;
40 self.to_be_added.clear();
41
42 if !self.expand_and_enqueue_unexpanded(state) {
43 self.queue.enqueue(state);
44 }
45 self.completable.push_row(&[]);
46 while let Some(state) = self.queue.pop() {
47 let (scanable, completable) = self.predict(state);
48 if completable {
49 self.complete(state);
50 }
51 if scanable {
52 self.to_be_added.push(state);
53 }
54 }
55 self.is_completed.push(self.accept_stop_token);
56 self.productivity.prune(&mut self.to_be_added);
58 let added = std::mem::take(&mut self.to_be_added);
59 self.scanable_history.push_row_owned(added);
60 }
61
62 pub fn push_one_state_to_check(&mut self, state: ParserState) {
67 self.completable.push_row(&[]);
68 self.is_completed
69 .push(*self.is_completed.last().unwrap_or(&false));
70 self.scanable_history.push_row(&[state]);
71 }
72
73 pub fn reset(&mut self) {
75 self.completable = Default::default();
76 self.scanable_history = Default::default();
77 self.is_completed.clear();
78 self.stop_token_is_accepted = false;
79 debug_assert!(self.queue.is_empty());
80 let root = Self::root_initial_state(&self.grammar);
81 self.push_state_and_expand(root);
82 }
83
84 pub(crate) fn expand_and_enqueue_unexpanded(&mut self, state: ParserState) -> bool {
88 if !state.is_unexpanded() {
89 return false;
90 }
91 let body_id = self.grammar.rule(state.rule_id).body_expr_id;
92 let fsm = self.grammar.per_rule_fsms[state.rule_id as usize]
93 .as_ref()
94 .expect("unexpanded rule must have a per-rule FSM");
95 self.queue.enqueue(ParserState::new(
96 state.rule_id,
97 body_id,
98 fsm.start() as i32,
99 NO_PREV_INPUT_POS,
100 0,
101 ));
102 true
103 }
104}