1use std::{collections::{HashSet, HashMap}, rc::Rc, usize};
2
3use indexmap::IndexSet;
4use petgraph::{Direction::Outgoing, prelude::EdgeIndex};
5use regex_automata::dfa::Automaton;
6
7use crate::{label::RegexTerminal, value::Value, AttributeKey, AttributeMap, GLLResult, ReturnMap};
8use crate::{GLLImplementationError, ImplementationResult, GLLError};
9use crate::{gss::{GSS, GSSNodeIndex, GSSNode}, sppf::{SPPF, SPPFNodeIndex, SPPFNode}, descriptor::Descriptor, GrammarSlot, ParseResult, GLLParseError, Terminal, Ident, ROOT_UUID, GLLBlockLabel};
10
11pub type LabelMap<'a> = HashMap<&'a str, GLLBlockLabel<'a>>;
13pub type RuleMap<'a> = HashMap<&'a str, Rc<Vec<Ident>>>;
15pub type RegexMap<'a> = HashMap<&'a str, Rc<RegexTerminal<'a>>>;
17
18pub struct GLLState<'a> {
72 input: &'a [u8],
74 gss: GSS<'a>,
75 sppf: SPPF<'a>,
76 pub input_pointer: usize, pub gss_pointer: GSSNodeIndex, gss_root: GSSNodeIndex, context_pointer: GSSNodeIndex, pub sppf_pointer: SPPFNodeIndex, pub sppf_root: SPPFNodeIndex, todo: IndexSet<Descriptor<'a>>, visited: HashSet<Descriptor<'a>>, pop: HashMap<GSSNodeIndex, Vec<SPPFNodeIndex>>, gss_map: HashMap<Rc<GSSNode<'a>>, GSSNodeIndex>,
99 sppf_map: HashMap<SPPFNode<'a>, SPPFNodeIndex>,
100 label_map: LabelMap<'a>,
101 rule_map: RuleMap<'a>,
102 regex_map: RegexMap<'a>,
103 pub errors: Vec<GLLError<'a>>
105}
106
107impl<'a> GLLState<'a> {
108 pub fn init(input: &'a [u8], label_map: LabelMap<'a>, rule_map: RuleMap<'a>, regex_map: RegexMap<'a>) -> ImplementationResult<'a, Self> {
115 let mut sppf = SPPF::default();
116 let mut gss = GSS::default();
117 let mut sppf_map = HashMap::new();
118 let mut gss_map = HashMap::new();
119 let root_slot = Rc::new(GrammarSlot::new(label_map.get(ROOT_UUID).ok_or(GLLImplementationError::MissingRoot)?.clone(), rule_map.get(ROOT_UUID).ok_or(GLLImplementationError::MissingRoot)?.clone(), 0, 0, ROOT_UUID));
120 let gss_root_node = Rc::new(GSSNode::new(root_slot.clone(), 0, Vec::default()));
121 let sppf_root = sppf.add_node(SPPFNode::Dummy);
122 let gss_root = gss.add_node(gss_root_node.clone());
123 sppf_map.insert(SPPFNode::Dummy, sppf_root);
124 gss_map.insert(gss_root_node, gss_root);
125 let mut state = GLLState {
126 input,
127 gss,
128 sppf,
129 input_pointer: 0,
130 gss_pointer: gss_root,
131 gss_root,
132 context_pointer: gss_root,
133 sppf_pointer: sppf_root,
134 sppf_root,
135 todo: IndexSet::default(),
136 visited: HashSet::default(),
137 pop: HashMap::default(),
138 gss_map,
139 sppf_map,
140 rule_map,
141 label_map,
142 regex_map,
143 errors: Vec::default(),
144 };
145 state.add(root_slot, gss_root, 0, sppf_root, gss_root);
146 Ok(state)
147 }
148
149 pub fn create(&mut self, slot: &Rc<GrammarSlot<'a>>, args: AttributeMap<'a>) -> ImplementationResult<'a, GSSNodeIndex> {
162 let candidate = GSSNode::new(slot.clone(), self.input_pointer, args);
163 let v = self.find_or_create_gss_node(candidate);
164 if self.gss.find_edge(v, self.gss_pointer).is_none() {
165 self.gss.add_edge(v, self.gss_pointer, self.sppf_pointer);
166 let pop = std::mem::take(&mut self.pop); if let Some(nodes) = pop.get(&v) {
168 for sppf_node in nodes {
169 let y = self.get_node_p(slot.clone(), self.sppf_pointer, *sppf_node, v, v == self.gss_pointer)?;
170 self.add(
171 slot.clone(),
172 self.gss_pointer,
173 self.get_sppf_node(*sppf_node)?.right_extend()?,
174 y,
175 v
176 );
177 }
178 }
179 self.pop = pop;
180 }
181 Ok(v)
182 }
183
184 fn get_packed_node(&self, parent: SPPFNodeIndex, ref_slot: &Rc<GrammarSlot<'a>>, i: usize, l: Option<SPPFNodeIndex>, r: SPPFNodeIndex) -> Option<SPPFNodeIndex> {
186 for child in self.sppf.neighbors_directed(parent, Outgoing) {
187 match self.sppf.node_weight(child) {
188 Some(SPPFNode::Packed { slot, split, left, right }) if slot == ref_slot && *split == i && *left == l && *right == r => return Some(child),
189 _ => {}
190 }
191 }
192 None
193 }
194
195 pub fn get_node_p(&mut self, slot: Rc<GrammarSlot<'a>>, left: SPPFNodeIndex, right: SPPFNodeIndex, context_pointer: GSSNodeIndex, gss_cycle: bool) -> ImplementationResult<'a, SPPFNodeIndex> {
203 if self.is_special_slot(&slot)? {
204 Ok(right)
205 } else {
206 let left_node = self.get_sppf_node(left)?;
207 let right_node = self.get_sppf_node(right)?;
208 let j = right_node.right_extend()?;
209 let (t, weight) = if slot.is_last(self) {
210 let new_slot = Rc::new(GrammarSlot { label: slot.label.clone(), rule: slot.rule.clone(), dot: slot.rule.len()+1, pos: 0, uuid: slot.uuid});
211 let weight = self.get_label(&slot.rule[0])._weight(self);
212 (new_slot, weight)
213 } else {
214 (slot.clone(), None)
215 };
216 if matches!(left_node, SPPFNode::Dummy) {
217 let i = right_node.left_extend()?;
218 let node = self.find_or_create_sppf_intermediate(&t, i, j, context_pointer)?;
219 if (gss_cycle || right != node) && self.get_packed_node(node, &slot, i, None, right).is_none() {
220 let packed = SPPFNode::Packed { slot, split: i, left: None, right };
221 let ix = self.sppf.add_node(packed);
222 self.sppf.add_edge(ix, right, None);
223 self.sppf.add_edge(node, ix, weight.transpose()?);
224 }
225 Ok(node)
226 } else {
227 let (i, k) = (left_node.left_extend()?, left_node.right_extend()?);
228 let node = self.find_or_create_sppf_intermediate(&t, i, j, context_pointer)?;
229 if (gss_cycle || (right != node && left != node)) && self.get_packed_node(node, &slot, k, Some(left), right).is_none() {
230 let packed = SPPFNode::Packed { slot, split: k, left: Some(left), right };
231 let ix = self.sppf.add_node(packed);
232 self.sppf.add_edge(ix, left, None);
233 self.sppf.add_edge(ix, right, None);
234 self.sppf.add_edge(node, ix, weight.transpose()?);
235 }
236 Ok(node)
237 }
238 }
239 }
240
241 pub fn get_node_t(&mut self, terminal: &'a [u8], left: usize, right: usize) -> SPPFNodeIndex {
245 self.find_or_create_sppf_symbol(terminal, left, right)
246 }
247
248 pub fn get_current_gss_node(&self) -> ImplementationResult<'a, &Rc<GSSNode<'a>>> {
253 self.get_gss_node(self.gss_pointer)
254 }
255
256 pub fn get_current_sppf_node(&self) -> ImplementationResult<'a, &SPPFNode<'a>> {
261 self.get_sppf_node(self.sppf_pointer)
262 }
263
264 pub(crate) fn get_sppf_node(&self, i: SPPFNodeIndex) -> ImplementationResult<'a, &SPPFNode<'a>> {
265 self.sppf.node_weight(i).ok_or_else(|| GLLImplementationError::MissingSPPFNode(i))
266 }
267
268 fn get_sppf_node_mut(&mut self, i: SPPFNodeIndex) -> ImplementationResult<'a, &mut SPPFNode<'a>> {
269 self.sppf.node_weight_mut(i).ok_or_else(|| GLLImplementationError::MissingSPPFNode(i))
270 }
271
272 fn get_gss_node(&self, i: GSSNodeIndex) -> ImplementationResult<'a, &Rc<GSSNode<'a>>> {
273 self.gss.node_weight(i).ok_or_else(|| GLLImplementationError::MissingGSSNode(i))
274 }
275
276 fn get_gss_edge_endpoints(&self, i: EdgeIndex) -> ImplementationResult<'a, (GSSNodeIndex, GSSNodeIndex)> {
277 self.gss.edge_endpoints(i).ok_or_else(|| GLLImplementationError::MissingGSSEdge(i))
278 }
279
280 fn get_gss_edge_weight(&self, i: EdgeIndex) -> ImplementationResult<'a, &SPPFNodeIndex> {
281 self.gss.edge_weight(i).ok_or_else(|| GLLImplementationError::MissingGSSEdge(i))
282 }
283
284 fn find_or_create_sppf_symbol(&mut self, terminal: &'a [u8], left: usize, right: usize) -> SPPFNodeIndex {
285 let candidate = SPPFNode::Symbol { terminal, left, right };
286 self.find_or_create_sppf(candidate)
287 }
288
289 fn find_or_create_sppf_intermediate(&mut self, slot: &Rc<GrammarSlot<'a>>, left: usize, right: usize, context_pointer: GSSNodeIndex) -> ImplementationResult<'a, SPPFNodeIndex> {
290 let context_node = self.get_gss_node(context_pointer)?.clone();
291 let candidate = SPPFNode::Intermediate {
292 slot: slot.clone(),
293 left,
294 right,
295 ret: Vec::default(),
296 context: context_node,
297 };
298 Ok(self.find_or_create_sppf(candidate))
299 }
300
301 fn find_or_create_gss_node(&mut self, node: GSSNode<'a>) -> GSSNodeIndex {
302 if let Some(i) = self.gss_map.get(&node) {
303 i.to_owned()
304 } else {
305 let rc = Rc::new(node);
306 let i = self.gss.add_node(rc.clone());
307 self.gss_map.insert(rc, i);
308 i
309 }
310 }
311
312 fn find_or_create_sppf(&mut self, candidate: SPPFNode<'a>) -> SPPFNodeIndex {
317 if let Some(ix) = self.sppf_map.get(&candidate) {
318 *ix
319 } else {
320 let ix = self.sppf.add_node(candidate.clone());
321 self.sppf_map.insert(candidate, ix);
322 ix
323 }
324 }
325
326 pub fn add(&mut self, slot: Rc<GrammarSlot<'a>>, g: GSSNodeIndex, i: usize, s: SPPFNodeIndex, context_pointer: GSSNodeIndex) {
330 let d = Descriptor::new(slot, g, i, s, context_pointer);
331 if !self.visited.contains(&d) {
332 self.visited.insert(d.clone());
333 self.todo.insert(d);
334 }
335 }
336
337 pub fn pop(&mut self, ret_vals: &ReturnMap<'a>, attrs: AttributeMap<'a>) -> ImplementationResult<'a, ()> {
355 let slot = self.get_current_gss_node()?.slot.clone();
356 let ctx_node = self.find_or_create_gss_node(GSSNode::new(slot.clone(), self.input_pointer, attrs));
357 let ctx = self.get_gss_node(ctx_node)?.clone();
358 let curr_sppf = self.get_sppf_node_mut(self.sppf_pointer)?;
359 if let SPPFNode::Intermediate { context, .. } = curr_sppf {
360 *context = ctx; }
362 if self.gss_pointer != self.gss_root {
363 if let Some(map) = self.pop.get_mut(&self.gss_pointer) {
364 map.push(self.sppf_pointer);
365 } else {
366 let map = vec![self.sppf_pointer];
367 self.pop.insert(self.gss_pointer, map);
368 }
369 let mut detached = self.gss.neighbors_directed(self.gss_pointer, Outgoing).detach();
370 while let Some(edge) = detached.next_edge(&self.gss) {
371 let v = self.get_gss_edge_endpoints(edge)?.1;
372 let y = self.get_node_p(slot.clone(), *self.get_gss_edge_weight(edge)?, self.sppf_pointer, self.gss_pointer, v == self.gss_pointer)?;
373 self.get_sppf_node_mut(y)?.insert_ret_vals(ret_vals.clone())?;
374 self.add(slot.clone(), v, self.input_pointer, y, self.gss_pointer);
375 }
376 }
377 Ok(())
378 }
379
380 fn __next(bytes: Terminal<'a>, start_pointer: usize, input: &'a [u8]) -> ParseResult<'a, usize> {
382 let mut pointer = start_pointer;
383 let input_len = input.len();
384 while pointer < input_len && input[pointer].is_ascii_whitespace() { pointer += 1;
386 }
387 for expected in bytes {
388 if pointer >= input_len {
389 return Err(GLLParseError::TooLong { pointer, offender: bytes })
390 }
391 let check = input[pointer];
392 if check != *expected && !check.is_ascii_whitespace() {
393 return Err(GLLParseError::UnexpectedByte { pointer, expected: *expected, offender: check })
394 }
395 pointer += 1;
396 }
397 Ok(pointer)
398 }
399
400 fn _next(&self, bytes: Terminal<'a>) -> ParseResult<'a, usize> {
402 Self::__next(bytes, self.input_pointer, self.input)
403 }
404
405 pub fn next(&mut self, bytes: Terminal<'a>) -> ParseResult<'a, ()> {
414 let pointer = self._next(bytes)?;
415 self.input_pointer = pointer;
416 Ok(())
417 }
418
419 pub fn has_next(&mut self, bytes: Terminal<'a>) -> bool {
421 self._next(bytes).is_ok()
422 }
423
424 #[must_use]
425 fn _next_regex(regex: &RegexTerminal<'a>, start_pointer: usize, input: &[u8]) -> Option<usize> {
426 let current_byte = &input[start_pointer..=start_pointer];
427 let Ok(mut curr_state) = regex.automaton.start_state_forward(¤t_byte.into()) else { return None
429 };
430 let input_len = input.len();
431 let mut i = 0;
432 let mut last_match = None;
433 while !regex.automaton.is_dead_state(curr_state) && !regex.automaton.is_quit_state(curr_state) { let pointer = start_pointer + i; if pointer >= input_len { break;
437 }
438 let byte = input[pointer];
439 curr_state = regex.automaton.next_state(curr_state, byte); if regex.automaton.is_match_state(curr_state) { last_match = Some(i); }
443 i += 1;
444 }
445 if regex.automaton.is_quit_state(curr_state) || regex.automaton.is_dead_state(curr_state) { last_match } else { let state = regex.automaton.next_eoi_state(curr_state); if regex.automaton.is_match_state(state) { Some(i)
451 } else {
452 last_match }
454 }
455 }
456
457 pub fn next_regex(&mut self, pattern: &'a str) -> GLLResult<'a, Option<Terminal<'a>>> {
464 let regex = self.get_regex_automaton(pattern)?;
465 if let Some(j) = Self::_next_regex(®ex, self.input_pointer, self.input) {
466 let result = &self.input[self.input_pointer..self.input_pointer + j];
467 self.input_pointer += j + 1;
468 Ok(Some(result))
469 } else {
470 Ok(None)
471 }
472 }
473
474 pub fn has_regex(&self, pattern: &'a str) -> GLLResult<'a, bool> {
479 let regex = self.get_regex_automaton(pattern)?;
480 Ok(Self::_next_regex(®ex, self.input_pointer, self.input).is_some())
481 }
482
483 pub fn regex_bytes(&self, pattern: &'a str) -> GLLResult<'a, Option<Terminal<'a>>> {
490 let regex = self.get_regex_automaton(pattern)?;
491 Ok(Self::_next_regex(®ex, self.input_pointer, self.input).map(|j| &self.input[self.input_pointer..self.input_pointer + j]))
492 }
493
494 #[must_use]
496 pub fn current_byte(&self) -> &[u8] {
497 &self.input[self.input_pointer..=self.input_pointer]
498 }
499
500 pub fn test_next(&mut self, label: &GLLBlockLabel<'a>) -> GLLResult<'a, bool> {
505 label.first(self)
506 }
507
508 pub fn get_rule(&self, ident: &'a str) -> ImplementationResult<'a, Rc<Vec<Ident>>> {
513 Ok(self.rule_map.get(ident).ok_or_else(|| GLLImplementationError::UnknownRule(ident))?.clone())
514 }
515
516 #[must_use]
518 pub fn get_label(&self, ident: &Ident) -> GLLBlockLabel<'a> {
519 let raw_string = ident.extract_string();
520 self.label_map.get(raw_string).map_or_else(|| todo!(), std::clone::Clone::clone)
521 }
522
523 pub fn get_label_by_uuid(&self, label: &'a str) -> ImplementationResult<'a, GLLBlockLabel<'a>> {
528 Ok(self.label_map.get(label).ok_or_else(|| GLLImplementationError::UnknownLabel(label))?.clone())
529 }
530
531 pub fn get_regex_automaton(&self, regex: &'a str) -> ImplementationResult<'a, Rc<RegexTerminal<'a>>> {
538 Ok(self.regex_map.get(regex).ok_or_else(|| GLLImplementationError::UnknownLabel(regex))?.clone())
539 }
540
541 pub fn get_attribute(&self, i: AttributeKey) -> ImplementationResult<'a, &Value<'a>> {
546 let node = self.get_gss_node(self.gss_pointer)?;
547 node.get_attribute(i).ok_or_else(|| GLLImplementationError::MissingAttribute(i, node.clone()))
548 }
549
550 pub fn restore_attribute(&self, i: AttributeKey) -> ImplementationResult<'a, &Value<'a>> {
555 let node = self.get_gss_node(self.context_pointer)?;
556 node.get_attribute(i).ok_or_else(|| GLLImplementationError::MissingContext(i, node.clone()))
557 }
558
559 pub fn get_ret_val(&self, i: AttributeKey) -> ImplementationResult<'a, Option<&Value<'a>>> {
568 self.get_sppf_node(self.sppf_pointer)?.get_ret_val(i)
569 }
570
571 fn is_special_slot(&self, slot: &GrammarSlot<'a>) -> ImplementationResult<'a, bool> {
577 Ok(if slot.dot == 1 && slot.pos == 0 && !slot.is_last(self) {
578 match slot.rule.first() {
579 Some(r) => {
580 let a = self.get_label(r);
581 a.str_parts().len() == 1 && (a.is_terminal() || !(a.is_nullable(self)?))
582 },
583 None => false
584 }
585 } else {
586 false
587 })
588 }
589
590 fn get_current_label_slot(&self, slot: &GrammarSlot<'a>) -> ImplementationResult<'a, GLLBlockLabel<'a>> {
591 Ok(self.get_label(slot.rule.get(slot.dot).ok_or_else(|| GLLImplementationError::CompletedSlot(slot.to_string(self, false)))?))
592 }
593
594 fn goto(&mut self, slot: &GrammarSlot<'a>) {
598 match self.get_current_label_slot(slot) {
599 Ok(label) => {
600 if let Err(e) = label.code(self) {
601 self.errors.push(e);
602 }
603 },
604 Err(e) => self.errors.push(e.into())
605 }
606 }
607
608 pub fn main(&mut self) {
612 while let Some(Descriptor {slot, gss, pointer, sppf, context_pointer}) = self.todo.pop() {
613 self.sppf_pointer = sppf;
614 self.gss_pointer = gss;
615 self.input_pointer = pointer;
616 self.context_pointer = context_pointer;
617 self.goto(&slot);
618 }
619 }
620
621 pub fn print_sppf_dot(&mut self, crop: bool, math_mode: bool) -> ImplementationResult<'a, String> {
626 if crop {
627 self.sppf.crop(self.find_roots_sppf());
628 }
629 self.sppf.to_dot(self, math_mode, &self.find_roots_sppf()) }
631
632 pub fn print_gss_dot(&self, math_mode: bool) -> ImplementationResult<'a, String> {
637 self.gss.to_dot(self, math_mode)
638 }
639
640 #[must_use]
642 pub fn accepts(&self) -> bool {
643 !self.find_roots_sppf().is_empty()
644 }
645
646 #[must_use]
650 pub fn final_accepts(&mut self) -> bool {
651 let success = self.accepts();
652 if !success && self.errors.is_empty() {
653 self.errors.push(GLLError::ImplementationError(GLLImplementationError::Fatal("Parser is not accepting, but no errors were encountered.")));
654 }
655 success
656 }
657
658 #[allow(clippy::expect_used)]
659 fn find_roots_sppf(&self) -> Vec<SPPFNodeIndex> {
660 let s_p = self.label_map.get(ROOT_UUID).expect("S' label not found in state. Should be impossible.");
661 let start_label = s_p.first_set(self).expect("Unable to get root uuid from S'. Should be impossible.");
662 let uuid = start_label[0].0[0].uuid();
663 self.sppf.find_accepting_roots(Some(self.input.len()), uuid)
664 }
665}