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