Skip to main content

rustemo/lr/
context.rs

1use crate::{
2    context::Context, input::Input, lexer::Token, parser::State, position::SourceSpan, Position,
3};
4
5/// [`Context`] implementation for LR parsing
6#[derive(Debug)]
7pub struct LRContext<'i, I: Input + ?Sized, S, TK> {
8    position: Position,
9
10    /// The span of token/non-terminal during shift/reduce operation.
11    span: SourceSpan,
12
13    /// Layout before the lookahead token (e.g. whitespaces, comments...)
14    layout_ahead: Option<&'i I>,
15
16    token_ahead: Option<Token<'i, I, TK>>,
17
18    state: S,
19}
20
21impl<I: Input + ?Sized, S: Default, TK> Default for LRContext<'_, I, S, TK> {
22    fn default() -> Self {
23        Self::new(I::start_position())
24    }
25}
26
27impl<I: Input + ?Sized, S: Default, TK> LRContext<'_, I, S, TK> {
28    pub fn new(position: Position) -> Self {
29        Self {
30            position,
31            span: SourceSpan {
32                start: position,
33                end: position,
34            },
35            layout_ahead: None,
36            token_ahead: None,
37            state: S::default(),
38        }
39    }
40}
41
42impl<'i, I, S, TK> Context<'i, I, S, TK> for LRContext<'i, I, S, TK>
43where
44    I: Input + ?Sized,
45    S: State,
46{
47    #[inline]
48    fn state(&self) -> S {
49        self.state
50    }
51
52    #[inline]
53    fn set_state(&mut self, state: S) {
54        self.state = state
55    }
56
57    #[inline]
58    fn position(&self) -> Position {
59        self.position
60    }
61
62    #[inline]
63    fn set_position(&mut self, position: Position) {
64        self.position = position
65    }
66
67    #[inline]
68    fn span(&self) -> SourceSpan {
69        self.span
70    }
71
72    #[inline]
73    fn set_span(&mut self, location: SourceSpan) {
74        self.span = location
75    }
76
77    #[inline]
78    fn token_ahead(&self) -> Option<&Token<'i, I, TK>> {
79        self.token_ahead.as_ref()
80    }
81
82    #[inline]
83    fn set_token_ahead(&mut self, token: Token<'i, I, TK>) {
84        self.token_ahead = Some(token)
85    }
86
87    #[inline]
88    fn layout_ahead(&self) -> Option<&'i I> {
89        self.layout_ahead
90    }
91
92    #[inline]
93    fn set_layout_ahead(&mut self, layout: Option<&'i I>) {
94        self.layout_ahead = layout
95    }
96}