mf_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)]
9pub struct Standard;
10
11impl<'arena, 'token_ref> Parser<'arena, 'token_ref, Standard> {
12 pub fn parse(&self) -> ParserResult<'arena> {
13 let root = self.binary_expression(0);
14
15 ParserResult {
16 root,
17 is_complete: self.is_done(),
18 metadata: self.node_metadata.clone().map(|t| t.into_inner()),
19 }
20 }
21
22 #[cfg_attr(feature = "stack-protection", recursive::recursive)]
23 fn binary_expression(
24 &self,
25 precedence: u8,
26 ) -> &'arena Node<'arena> {
27 let mut node_left = self.unary_expression();
28 let Some(mut token) = self.current() else {
29 return node_left;
30 };
31
32 while let TokenKind::Operator(operator) = &token.kind {
33 if self.is_done() {
34 break;
35 }
36
37 let Some(op) = BINARY_OPERATORS.get(operator) else {
38 break;
39 };
40
41 if op.precedence < precedence {
42 break;
43 }
44
45 self.next();
46 let node_right = match op.associativity {
47 Associativity::Left => {
48 self.binary_expression(op.precedence + 1)
49 },
50 _ => self.binary_expression(op.precedence),
51 };
52
53 node_left = self.node(
54 Node::Binary {
55 operator: *operator,
56 left: node_left,
57 right: node_right,
58 },
59 |h| NodeMetadata {
60 span: h.span(node_left, node_right).unwrap_or_default(),
61 },
62 );
63
64 let Some(t) = self.current() else {
65 break;
66 };
67 token = t;
68 }
69
70 if precedence == 0 {
71 if let Some(conditional_node) =
72 self.conditional(node_left, &|_| self.binary_expression(0))
73 {
74 node_left = conditional_node;
75 }
76 }
77
78 node_left
79 }
80
81 fn unary_expression(&self) -> &'arena Node<'arena> {
82 let Some(token) = self.current() else {
83 return self.error(AstNodeError::Custom {
84 message: self
85 .bump
86 .alloc_str("Unexpected end of unary expression"),
87 span: (self.prev_token_end(), self.prev_token_end()),
88 });
89 };
90
91 if self.depth() > 0
92 && token.kind
93 == TokenKind::Identifier(Identifier::CallbackReference)
94 {
95 self.next();
96
97 let node =
98 self.node(Node::Pointer, |_| NodeMetadata { span: token.span });
99 let (n, _) =
100 self.with_postfix(node, &|_| self.binary_expression(0));
101 return n;
102 }
103
104 if let TokenKind::Operator(operator) = &token.kind {
105 let Some(unary_operator) = UNARY_OPERATORS.get(operator) else {
106 return self.error(AstNodeError::UnexpectedToken {
107 expected: "UnaryOperator",
108 received: self
109 .bump
110 .alloc_str(token.kind.to_string().as_str()),
111 span: token.span,
112 });
113 };
114
115 self.next();
116 let expr = self.binary_expression(unary_operator.precedence);
117 let node = self.node(
118 Node::Unary { operator: *operator, node: expr },
119 |h| NodeMetadata {
120 span: (
121 token.span.0,
122 h.metadata(expr).map(|n| n.span.1).unwrap_or_default(),
123 ),
124 },
125 );
126
127 return node;
128 }
129
130 if let Some(interval_node) =
131 self.interval(&|_| self.binary_expression(0))
132 {
133 return interval_node;
134 }
135
136 if token.kind == TokenKind::Bracket(Bracket::LeftParenthesis) {
137 let p_start = self.current().map(|s| s.span.0);
138
139 self.next();
140 let binary_node = self.binary_expression(0);
141 if let Some(error_node) =
142 self.expect(TokenKind::Bracket(Bracket::RightParenthesis))
143 {
144 return error_node;
145 };
146
147 let expr =
148 self.node(Node::Parenthesized(binary_node), |_| NodeMetadata {
149 span: (p_start.unwrap_or_default(), self.prev_token_end()),
150 });
151
152 let (n, _) =
153 self.with_postfix(expr, &|_| self.binary_expression(0));
154 return n;
155 }
156
157 self.literal(&|_| self.binary_expression(0))
158 }
159}