1use crate::{
2 context::Context, input::Input, lexer::Token, parser::State, position::SourceSpan, Position,
3};
4
5#[derive(Debug)]
7pub struct LRContext<'i, I: Input + ?Sized, S, TK> {
8 position: Position,
9
10 span: SourceSpan,
12
13 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}