moduforge_rules_expression/parser/
standard.rs1use crate::lexer::{Bracket, Identifier, TokenKind};
2use crate::parser::ast::{AstNodeError, Node};
3use crate::parser::constants::{Associativity, BINARY_OPERATORS, UNARY_OPERATORS};
4use crate::parser::parser::Parser;
5use crate::parser::result::ParserResult;
6use crate::parser::NodeMetadata;
7
8#[derive(Debug)]
11pub struct Standard;
12
13impl<'arena, 'token_ref> Parser<'arena, 'token_ref, Standard> {
14 pub fn parse(&self) -> ParserResult<'arena> {
17 let root = self.binary_expression(0);
18
19 ParserResult {
20 root,
21 is_complete: self.is_done(),
22 metadata: self.node_metadata.clone().map(|t| t.into_inner()),
23 }
24 }
25
26 #[cfg_attr(feature = "stack-protection", recursive::recursive)]
32 fn binary_expression(
33 &self,
34 precedence: u8,
35 ) -> &'arena Node<'arena> {
36 let mut node_left = self.unary_expression();
38 let Some(mut token) = self.current() else {
39 return node_left;
40 };
41
42 while let TokenKind::Operator(operator) = &token.kind {
44 if self.is_done() {
45 break;
46 }
47
48 let Some(op) = BINARY_OPERATORS.get(operator) else {
50 break;
51 };
52
53 if op.precedence < precedence {
55 break;
56 }
57
58 self.next();
59 let node_right = match op.associativity {
61 Associativity::Left => {
62 self.binary_expression(op.precedence + 1)
63 }, _ => self.binary_expression(op.precedence), };
66
67 node_left = self.node(
69 Node::Binary {
70 operator: *operator,
71 left: node_left,
72 right: node_right,
73 },
74 |h| NodeMetadata {
75 span: h.span(node_left, node_right).unwrap_or_default(),
76 },
77 );
78
79 let Some(t) = self.current() else {
81 break;
82 };
83 token = t;
84 }
85
86 if precedence == 0 {
88 if let Some(conditional_node) =
89 self.conditional(node_left, |_| self.binary_expression(0))
90 {
91 node_left = conditional_node;
92 }
93 }
94
95 node_left
96 }
97
98 fn unary_expression(&self) -> &'arena Node<'arena> {
101 let Some(token) = self.current() else {
102 return self.error(AstNodeError::Custom {
103 message: self
104 .bump
105 .alloc_str("Unexpected end of unary expression"),
106 span: (self.prev_token_end(), self.prev_token_end()),
107 });
108 };
109
110 if self.depth() > 0
112 && token.kind
113 == TokenKind::Identifier(Identifier::CallbackReference)
114 {
115 self.next();
116
117 let node =
118 self.node(Node::Pointer, |_| NodeMetadata { span: token.span });
119 return self.with_postfix(node, |_| self.binary_expression(0));
120 }
121
122 if let TokenKind::Operator(operator) = &token.kind {
124 let Some(unary_operator) = UNARY_OPERATORS.get(operator) else {
125 return self.error(AstNodeError::UnexpectedToken {
126 expected: "UnaryOperator",
127 received: self
128 .bump
129 .alloc_str(token.kind.to_string().as_str()),
130 span: token.span,
131 });
132 };
133
134 self.next();
135 let expr = self.binary_expression(unary_operator.precedence);
136 let node = self.node(
137 Node::Unary { operator: *operator, node: expr },
138 |h| NodeMetadata {
139 span: (
140 token.span.0,
141 h.metadata(expr).map(|n| n.span.1).unwrap_or_default(),
142 ),
143 },
144 );
145
146 return node;
147 }
148
149 if let Some(interval_node) =
151 self.interval(|_| self.binary_expression(0))
152 {
153 return interval_node;
154 }
155
156 if token.kind == TokenKind::Bracket(Bracket::LeftParenthesis) {
158 let p_start = self.current().map(|s| s.span.0);
159
160 self.next();
161 let binary_node = self.binary_expression(0);
162 if let Some(error_node) =
163 self.expect(TokenKind::Bracket(Bracket::RightParenthesis))
164 {
165 return error_node;
166 };
167
168 let expr =
169 self.node(Node::Parenthesized(binary_node), |_| NodeMetadata {
170 span: (p_start.unwrap_or_default(), self.prev_token_end()),
171 });
172
173 return self.with_postfix(expr, |_| self.binary_expression(0));
174 }
175
176 self.literal(|_| self.binary_expression(0))
178 }
179}