moduforge_rules_expression/parser/
parser.rs

1use crate::functions::{FunctionKind, MethodKind};
2use crate::lexer::{
3    Bracket, ComparisonOperator, Identifier, Operator, QuotationMark,
4    TemplateString, Token, TokenKind,
5};
6use crate::parser::ast::{AstNodeError, Node};
7use crate::parser::error::ParserError;
8use crate::parser::standard::Standard;
9use crate::parser::unary::Unary;
10use crate::parser::NodeMetadata;
11use bumpalo::collections::Vec as BumpVec;
12use bumpalo::Bump;
13use nohash_hasher::BuildNoHashHasher;
14use rust_decimal::Decimal;
15use std::cell::{Cell, RefCell};
16use std::collections::HashMap;
17use std::fmt::Debug;
18use std::marker::PhantomData;
19use std::ops::Deref;
20
21/// 期望特定令牌的宏
22/// 如果令牌不匹配则返回错误节点
23macro_rules! expect {
24    ($self:ident, $token:expr) => {
25        if let Some(error_node) = $self.expect($token) {
26            return error_node;
27        }
28    };
29}
30
31/// 分配格式化字符串的宏
32/// 将格式化后的字符串分配到内存池中
33macro_rules! afmt {
34    ($self:expr, $($arg:tt)*) => {{
35        let formatted = format!($($arg)*);
36        $self.bump.alloc_str(formatted.as_str())
37    }}
38}
39
40/// 基础解析器结构体
41/// 用作解析器类型标记
42#[derive(Debug)]
43pub struct BaseParser;
44
45/// 通用解析器结构体
46///
47/// # 泛型参数
48/// * `'arena` - 内存池生命周期,用于分配AST节点
49/// * `'token_ref` - 令牌引用生命周期
50/// * `Flavor` - 解析器类型标记(Standard 或 Unary)
51#[derive(Debug)]
52pub struct Parser<'arena, 'token_ref, Flavor> {
53    tokens: &'token_ref [Token<'arena>], // 令牌数组
54    current: Cell<Option<&'token_ref Token<'arena>>>, // 当前令牌
55    pub(crate) bump: &'arena Bump,       // 内存分配池
56    position: Cell<usize>,               // 当前位置
57    depth: Cell<u8>,                     // 嵌套深度
58    marker_flavor: PhantomData<Flavor>,  // 类型标记
59    has_range_operator: bool,            // 是否包含范围操作符
60    pub(crate) node_metadata:
61        Option<RefCell<HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>>>, // 节点元数据
62}
63
64impl<'arena, 'token_ref> Parser<'arena, 'token_ref, BaseParser> {
65    /// 尝试创建新的基础解析器
66    ///
67    /// # 参数
68    /// * `tokens` - 令牌数组
69    /// * `bump` - 内存分配池
70    ///
71    /// # 返回值
72    /// 返回解析器或解析错误
73    pub fn try_new(
74        tokens: &'token_ref [Token<'arena>],
75        bump: &'arena Bump,
76    ) -> Result<Self, ParserError> {
77        let current = tokens.get(0);
78        let has_range_operator = tokens
79            .iter()
80            .any(|t| t.kind == TokenKind::Operator(Operator::Range));
81
82        Ok(Self {
83            tokens,
84            bump,
85            current: Cell::new(current),
86            depth: Cell::new(0),
87            position: Cell::new(0),
88            has_range_operator,
89            node_metadata: None,
90            marker_flavor: PhantomData,
91        })
92    }
93
94    /// 转换为标准解析器
95    /// 标准解析器支持完整的表达式语法
96    pub fn standard(self) -> Parser<'arena, 'token_ref, Standard> {
97        Parser {
98            tokens: self.tokens,
99            bump: self.bump,
100            current: self.current,
101            depth: self.depth,
102            position: self.position,
103            has_range_operator: self.has_range_operator,
104            node_metadata: self.node_metadata,
105            marker_flavor: PhantomData,
106        }
107    }
108
109    /// 转换为一元解析器
110    /// 一元解析器专门用于布尔表达式求值
111    pub fn unary(self) -> Parser<'arena, 'token_ref, Unary> {
112        Parser {
113            tokens: self.tokens,
114            bump: self.bump,
115            current: self.current,
116            depth: self.depth,
117            position: self.position,
118            has_range_operator: self.has_range_operator,
119            node_metadata: self.node_metadata,
120            marker_flavor: PhantomData,
121        }
122    }
123}
124
125impl<'arena, 'token_ref, Flavor> Parser<'arena, 'token_ref, Flavor> {
126    /// 启用元数据收集
127    /// 收集节点的位置信息等元数据
128    pub fn with_metadata(mut self) -> Parser<'arena, 'token_ref, Flavor> {
129        self.node_metadata = Some(Default::default());
130        self
131    }
132
133    /// 获取当前令牌
134    pub(crate) fn current(&self) -> Option<&Token<'arena>> {
135        self.current.get()
136    }
137
138    /// 获取当前令牌类型
139    pub(crate) fn current_kind(&self) -> Option<&TokenKind> {
140        self.current.get().map(|token| &token.kind)
141    }
142
143    /// 获取当前令牌开始位置
144    fn token_start(&self) -> u32 {
145        match self.current() {
146            None => self.tokens.last().map(|t| t.span.1).unwrap_or_default(),
147            Some(t) => t.span.0,
148        }
149    }
150
151    /// 获取当前令牌结束位置(未使用)
152    #[allow(dead_code)]
153    fn token_end(&self) -> u32 {
154        match self.current() {
155            None => self.tokens.last().map(|t| t.span.1).unwrap_or_default(),
156            Some(t) => t.span.1,
157        }
158    }
159
160    /// 获取前一个令牌的结束位置
161    pub(crate) fn prev_token_end(&self) -> u32 {
162        let Some(pos) = self.position().checked_sub(1) else {
163            return self.token_start();
164        };
165
166        match self.tokens.get(pos) {
167            None => self.token_start(),
168            Some(t) => t.span.1,
169        }
170    }
171
172    /// 获取当前位置
173    fn position(&self) -> usize {
174        self.position.get()
175    }
176
177    /// 设置位置并更新当前令牌
178    fn set_position(
179        &self,
180        position: usize,
181    ) -> bool {
182        let target_token = self.tokens.get(position);
183
184        self.position.set(position);
185        self.current.set(target_token);
186
187        target_token.is_some()
188    }
189
190    /// 获取当前嵌套深度
191    pub(crate) fn depth(&self) -> u8 {
192        self.depth.get()
193    }
194
195    /// 检查是否已到达令牌流末尾
196    pub(crate) fn is_done(&self) -> bool {
197        self.current.get().is_none()
198    }
199
200    /// 创建新的AST节点并收集元数据
201    ///
202    /// # 参数
203    /// * `node` - 要创建的节点
204    /// * `gen_metadata` - 生成元数据的函数
205    ///
206    /// # 返回值
207    /// 返回分配在内存池中的节点引用
208    pub(crate) fn node<F>(
209        &self,
210        node: Node<'arena>,
211        gen_metadata: F,
212    ) -> &'arena Node<'arena>
213    where
214        F: FnOnce(MetadataHelper<'_, 'arena>) -> NodeMetadata,
215    {
216        let node = self.bump.alloc(node);
217        if let Some(node_metadata) = &self.node_metadata {
218            let metadata = {
219                let nm = node_metadata.borrow();
220                gen_metadata(MetadataHelper {
221                    node_metadata: nm.deref(),
222                    arena: PhantomData::<&'arena ()>,
223                })
224            };
225
226            let mut nm = node_metadata.borrow_mut();
227            nm.insert(node as *const Node as usize, metadata);
228        };
229
230        node
231    }
232
233    /// 创建错误节点
234    ///
235    /// # 参数
236    /// * `error` - 错误信息
237    ///
238    /// # 返回值
239    /// 返回包含错误信息的AST节点
240    pub(crate) fn error(
241        &self,
242        error: AstNodeError<'arena>,
243    ) -> &'arena Node<'arena> {
244        self.node(Node::Error { error, node: None }, |_| NodeMetadata {
245            span: (self.prev_token_end(), self.prev_token_end()),
246        })
247    }
248
249    /// 创建带有关联节点的错误节点
250    ///
251    /// # 参数
252    /// * `error` - 错误信息
253    /// * `node` - 关联的节点
254    ///
255    /// # 返回值
256    /// 返回包含错误信息和关联节点的AST节点
257    pub(crate) fn error_with_node(
258        &self,
259        error: AstNodeError<'arena>,
260        node: &'arena Node<'arena>,
261    ) -> &'arena Node<'arena> {
262        self.node(Node::Error { error, node: Some(node) }, |_| NodeMetadata {
263            span: node.span().unwrap_or_default(),
264        })
265    }
266
267    pub(crate) fn next(&self) {
268        let new_position = self.position.get() + 1;
269
270        self.position.set(new_position);
271        self.current.set(self.tokens.get(new_position));
272    }
273
274    pub(crate) fn expect(
275        &self,
276        kind: TokenKind,
277    ) -> Option<&'arena Node<'arena>> {
278        let token = self.current();
279        if token.is_some_and(|t| t.kind == kind) {
280            self.next();
281            return None;
282        }
283
284        Some(
285            self.error(AstNodeError::UnexpectedToken {
286                expected: afmt!(self, "{kind}"),
287                received: token
288                    .map(|t| afmt!(self, "{}", t.kind))
289                    .unwrap_or_else(|| afmt!(self, "None")),
290                span: token
291                    .map(|t| t.span)
292                    .unwrap_or((self.token_end(), self.token_end())),
293            }),
294        )
295    }
296
297    pub(crate) fn number(&self) -> &'arena Node<'arena> {
298        let Some(token) = self.current() else {
299            return self.error(AstNodeError::MissingToken {
300                expected: afmt!(self, "Number"),
301                position: self.position(),
302            });
303        };
304
305        let Ok(decimal) = Decimal::from_str_exact(token.value)
306            .or_else(|_| Decimal::from_scientific(token.value))
307        else {
308            return self.error(AstNodeError::InvalidNumber {
309                number: afmt!(self, "{}", token.value),
310                span: token.span,
311            });
312        };
313
314        self.next();
315        self.node(Node::Number(decimal), |_| NodeMetadata { span: token.span })
316    }
317
318    pub(crate) fn bool(&self) -> &'arena Node<'arena> {
319        let Some(token) = self.current() else {
320            return self.error(AstNodeError::MissingToken {
321                expected: afmt!(self, "Boolean"),
322                position: self.position(),
323            });
324        };
325
326        let TokenKind::Boolean(boolean) = token.kind else {
327            return self.error(AstNodeError::InvalidBoolean {
328                boolean: afmt!(self, "{}", token.value),
329                span: token.span,
330            });
331        };
332
333        self.next();
334        self.node(Node::Bool(boolean), |_| NodeMetadata { span: token.span })
335    }
336
337    pub(crate) fn null(&self) -> &'arena Node<'arena> {
338        let Some(token) = self.current() else {
339            return self.error(AstNodeError::MissingToken {
340                expected: afmt!(self, "Null"),
341                position: self.position(),
342            });
343        };
344
345        if token.kind != TokenKind::Identifier(Identifier::Null) {
346            return self.error(AstNodeError::UnexpectedIdentifier {
347                expected: afmt!(self, "Null"),
348                received: afmt!(self, "{}", token.value),
349                span: token.span,
350            });
351        }
352
353        self.next();
354        self.node(Node::Null, |_| NodeMetadata { span: token.span })
355    }
356
357    pub(crate) fn simple_string(
358        &self,
359        quote_mark: &QuotationMark,
360    ) -> &'arena Node<'arena> {
361        expect!(self, TokenKind::QuotationMark(quote_mark.clone()));
362        let string_value = self.current();
363
364        let error_literal = self.expect(TokenKind::Literal);
365        let error_mark_end =
366            self.expect(TokenKind::QuotationMark(quote_mark.clone()));
367
368        error_literal
369            .or(error_mark_end)
370            .or(string_value.map(|t| {
371                self.node(Node::String(t.value), |_| NodeMetadata {
372                    span: (t.span.0 - 1, t.span.1 + 1),
373                })
374            }))
375            .unwrap_or_else(|| {
376                self.error(AstNodeError::Custom {
377                    message: afmt!(
378                        self,
379                        "Failed to parse string `{}`",
380                        string_value.map(|s| s.value).unwrap_or_default()
381                    ),
382                    span: string_value.map(|s| s.span).unwrap_or((
383                        self.prev_token_end(),
384                        self.prev_token_end(),
385                    )),
386                })
387            })
388    }
389
390    pub(crate) fn template_string<F>(
391        &self,
392        expression_parser: F,
393    ) -> &'arena Node<'arena>
394    where
395        F: Fn(ParserContext) -> &'arena Node<'arena>,
396    {
397        expect!(self, TokenKind::QuotationMark(QuotationMark::Backtick));
398
399        let Some(mut current_token) = self.current() else {
400            return self.error(AstNodeError::MissingToken {
401                expected: afmt!(self, "Backtick (`)"),
402                position: self.position(),
403            });
404        };
405
406        let mut span = (current_token.span.0 - 1, 0u32);
407
408        let mut nodes = BumpVec::new_in(self.bump);
409        while TokenKind::QuotationMark(QuotationMark::Backtick)
410            != current_token.kind
411        {
412            match current_token.kind {
413                TokenKind::TemplateString(template) => match template {
414                    TemplateString::ExpressionStart => {
415                        self.next();
416                        nodes.push(expression_parser(ParserContext::Global));
417
418                        if let Some(error) =
419                            self.expect(TokenKind::TemplateString(
420                                TemplateString::ExpressionEnd,
421                            ))
422                        {
423                            nodes.push(error);
424                        }
425                    },
426                    TemplateString::ExpressionEnd => {
427                        self.next();
428                    },
429                },
430                TokenKind::Literal => {
431                    nodes.push(
432                        self.node(Node::String(current_token.value), |_| {
433                            NodeMetadata { span: current_token.span }
434                        }),
435                    );
436                    self.next();
437                },
438                _ => {
439                    return self.error(AstNodeError::UnexpectedToken {
440                        expected: afmt!(self, "Valid TemplateString token"),
441                        received: afmt!(self, "{}", current_token.kind),
442                        span: current_token.span,
443                    });
444                },
445            }
446
447            if let Some(ct) = self.current() {
448                current_token = ct;
449                span.1 = ct.span.1;
450            } else {
451                break;
452            }
453        }
454
455        expect!(self, TokenKind::QuotationMark(QuotationMark::Backtick));
456        self.node(Node::TemplateString(nodes.into_bump_slice()), |_| {
457            NodeMetadata { span }
458        })
459    }
460
461    pub(crate) fn method_call<F>(
462        &self,
463        node: &'arena Node,
464        method_name: &Token,
465        expression_parser: F,
466    ) -> &'arena Node<'arena>
467    where
468        F: Fn(ParserContext) -> &'arena Node<'arena>,
469    {
470        let Some(method_kind) = MethodKind::try_from(method_name.value).ok()
471        else {
472            return self.error(AstNodeError::UnknownMethod {
473                name: afmt!(self, "{}", method_name.value),
474                span: method_name.span,
475            });
476        };
477
478        expect!(self, TokenKind::Bracket(Bracket::LeftParenthesis));
479
480        let mut arguments = BumpVec::new_in(&self.bump);
481        loop {
482            if self.current_kind()
483                == Some(&TokenKind::Bracket(Bracket::RightParenthesis))
484            {
485                break;
486            }
487
488            arguments.push(expression_parser(ParserContext::Global));
489            if self.current_kind()
490                != Some(&TokenKind::Operator(Operator::Comma))
491            {
492                break;
493            }
494
495            if let Some(error) =
496                self.expect(TokenKind::Operator(Operator::Comma))
497            {
498                arguments.push(error);
499                break;
500            }
501        }
502
503        if let Some(error) =
504            self.expect(TokenKind::Bracket(Bracket::RightParenthesis))
505        {
506            arguments.push(error);
507        }
508
509        let method_node = self.node(
510            Node::MethodCall {
511                this: node,
512                kind: method_kind,
513                arguments: arguments.into_bump_slice(),
514            },
515            |h| NodeMetadata {
516                span: (
517                    h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
518                    self.prev_token_end(),
519                ),
520            },
521        );
522
523        self.with_postfix(method_node, expression_parser)
524    }
525
526    pub(crate) fn with_postfix<F>(
527        &self,
528        node: &'arena Node<'arena>,
529        expression_parser: F,
530    ) -> &'arena Node<'arena>
531    where
532        F: Fn(ParserContext) -> &'arena Node<'arena>,
533    {
534        let Some(postfix_token) = self.current() else {
535            return node;
536        };
537
538        let postfix_kind = PostfixKind::from(postfix_token);
539
540        let processed_token = match postfix_kind {
541            PostfixKind::Other => return node,
542            PostfixKind::MemberAccess => {
543                self.next();
544                let property_token = self.current();
545                self.next();
546
547                let property = match property_token {
548                    None => self.error_with_node(
549                        AstNodeError::Custom {
550                            message: afmt!(self, "Expected a property"),
551                            span: (
552                                self.prev_token_end(),
553                                self.prev_token_end(),
554                            ),
555                        },
556                        node,
557                    ),
558                    Some(t) => match is_valid_property(t) {
559                        true => {
560                            if self.current_kind()
561                                == Some(&TokenKind::Bracket(
562                                    Bracket::LeftParenthesis,
563                                ))
564                            {
565                                return self.method_call(
566                                    node,
567                                    t,
568                                    expression_parser,
569                                );
570                            }
571
572                            self.node(Node::String(t.value), |_| NodeMetadata {
573                                span: t.span,
574                            })
575                        },
576                        false => {
577                            self.set_position(self.position() - 1);
578                            self.error_with_node(
579                                AstNodeError::InvalidProperty {
580                                    property: afmt!(self, "{}", t.value),
581                                    span: t.span,
582                                },
583                                node,
584                            )
585                        },
586                    },
587                };
588
589                self.node(Node::Member { node, property }, |h| NodeMetadata {
590                    span: h.span(node, property).unwrap_or_default(),
591                })
592            },
593            PostfixKind::PropertyAccess => {
594                self.next();
595                let mut from: Option<&'arena Node<'arena>> = None;
596                let mut to: Option<&'arena Node<'arena>> = None;
597
598                let Some(mut c) = self.current() else {
599                    return self.error_with_node(
600                        AstNodeError::Custom {
601                            message: afmt!(self, "Expected a property"),
602                            span: (
603                                self.prev_token_end(),
604                                self.prev_token_end(),
605                            ),
606                        },
607                        node,
608                    );
609                };
610
611                if c.kind == TokenKind::Operator(Operator::Slice) {
612                    self.next();
613
614                    let Some(cc) = self.current() else {
615                        return self.error_with_node(
616                            AstNodeError::Custom {
617                                message: afmt!(self, "Unexpected token"),
618                                span: (
619                                    self.prev_token_end(),
620                                    self.prev_token_end(),
621                                ),
622                            },
623                            node,
624                        );
625                    };
626                    c = cc;
627
628                    if c.kind != TokenKind::Bracket(Bracket::RightSquareBracket)
629                    {
630                        to = Some(expression_parser(ParserContext::Global));
631                    }
632
633                    expect!(
634                        self,
635                        TokenKind::Bracket(Bracket::RightSquareBracket)
636                    );
637                    self.node(Node::Slice { node, to, from }, |h| {
638                        NodeMetadata {
639                            span: (
640                                h.metadata(node)
641                                    .map(|m| m.span.0)
642                                    .unwrap_or_default(),
643                                self.prev_token_end(),
644                            ),
645                        }
646                    })
647                } else {
648                    let from_node = expression_parser(ParserContext::Global);
649                    from = Some(from_node);
650                    let Some(cc) = self.current() else {
651                        return self.error_with_node(
652                            AstNodeError::Custom {
653                                message: afmt!(self, "Unexpected token"),
654                                span: (
655                                    self.prev_token_end(),
656                                    self.prev_token_end(),
657                                ),
658                            },
659                            self.node(
660                                Node::Member { node, property: from_node },
661                                |h| NodeMetadata {
662                                    span: h
663                                        .span(node, from_node)
664                                        .unwrap_or_default(),
665                                },
666                            ),
667                        );
668                    };
669                    c = cc;
670
671                    if c.kind == TokenKind::Operator(Operator::Slice) {
672                        self.next();
673                        let Some(cc) = self.current() else {
674                            return self.error_with_node(
675                                AstNodeError::Custom {
676                                    message: afmt!(
677                                        self,
678                                        "Invalid slice syntax"
679                                    ),
680                                    span: (
681                                        self.prev_token_end(),
682                                        self.prev_token_end(),
683                                    ),
684                                },
685                                self.node(
686                                    Node::Slice { node, from, to },
687                                    |h| NodeMetadata {
688                                        span: h
689                                            .span(node, from_node)
690                                            .unwrap_or_default(),
691                                    },
692                                ),
693                            );
694                        };
695                        c = cc;
696
697                        if c.kind
698                            != TokenKind::Bracket(Bracket::RightSquareBracket)
699                        {
700                            to = Some(expression_parser(ParserContext::Global));
701                        }
702
703                        expect!(
704                            self,
705                            TokenKind::Bracket(Bracket::RightSquareBracket)
706                        );
707                        self.node(Node::Slice { node, from, to }, |h| {
708                            NodeMetadata {
709                                span: (
710                                    h.metadata(node)
711                                        .map(|m| m.span.0)
712                                        .unwrap_or_default(),
713                                    self.prev_token_end(),
714                                ),
715                            }
716                        })
717                    } else {
718                        // Slice operator [:] was not found,
719                        // it should be just an index node.
720                        expect!(
721                            self,
722                            TokenKind::Bracket(Bracket::RightSquareBracket)
723                        );
724                        self.node(
725                            Node::Member {
726                                node,
727                                property: from.unwrap_or_else(|| {
728                                    return self.error_with_node(
729                                        AstNodeError::Custom {
730                                            message: afmt!(
731                                                self,
732                                                "Invalid index property"
733                                            ),
734                                            span: (
735                                                self.prev_token_end(),
736                                                self.prev_token_end(),
737                                            ),
738                                        },
739                                        node,
740                                    );
741                                }),
742                            },
743                            |h| NodeMetadata {
744                                span: (
745                                    h.metadata(node)
746                                        .map(|m| m.span.0)
747                                        .unwrap_or_default(),
748                                    self.prev_token_end(),
749                                ),
750                            },
751                        )
752                    }
753                }
754            },
755        };
756
757        self.with_postfix(processed_token, expression_parser)
758    }
759
760    /// Closure
761    pub(crate) fn closure<F>(
762        &self,
763        expression_parser: F,
764    ) -> &'arena Node<'arena>
765    where
766        F: Fn(ParserContext) -> &'arena Node<'arena>,
767    {
768        let start = self.token_start();
769
770        self.depth.set(self.depth.get() + 1);
771        let node = expression_parser(ParserContext::Closure);
772        self.depth.set(self.depth.get() - 1);
773
774        self.node(Node::Closure(node), |_| NodeMetadata {
775            span: (start, self.prev_token_end()),
776        })
777    }
778
779    /// Identifier expression
780    /// Either <Identifier> or <Identifier Expression>
781    pub(crate) fn identifier<F>(
782        &self,
783        expression_parser: F,
784    ) -> &'arena Node<'arena>
785    where
786        F: Fn(ParserContext) -> &'arena Node<'arena>,
787    {
788        let Some(token) = self.current() else {
789            return self.error(AstNodeError::MissingToken {
790                expected: afmt!(self, "Identifier"),
791                position: self.position(),
792            });
793        };
794
795        match token.kind {
796            TokenKind::Identifier(_) | TokenKind::Literal => {
797                // ok
798            },
799            _ => {
800                return self.error(AstNodeError::Custom {
801                    message: afmt!(
802                        self,
803                        "Expected an `identifier`, received `{}`.",
804                        token.kind
805                    ),
806                    span: token.span,
807                });
808            },
809        }
810
811        let Some(identifier_token) = self.current() else {
812            return self.error(AstNodeError::Custom {
813                message: afmt!(self, "Expected an `identifier`."),
814                span: (self.prev_token_end(), self.prev_token_end()),
815            });
816        };
817        self.next();
818
819        let current_token = self.current();
820        if current_token.map(|t| t.kind)
821            != Some(TokenKind::Bracket(Bracket::LeftParenthesis))
822        {
823            let identifier_node = match identifier_token.kind {
824                TokenKind::Identifier(Identifier::RootReference) => self
825                    .node(Node::Root, |_| NodeMetadata {
826                        span: identifier_token.span,
827                    }),
828                _ => self
829                    .node(Node::Identifier(identifier_token.value), |_| {
830                        NodeMetadata { span: identifier_token.span }
831                    }),
832            };
833
834            return self.with_postfix(identifier_node, expression_parser);
835        }
836
837        // Potentially it might be a built-in expression
838        let Ok(function) = FunctionKind::try_from(identifier_token.value)
839        else {
840            return self.error(AstNodeError::UnknownBuiltIn {
841                name: afmt!(self, "{}", identifier_token.value),
842                span: identifier_token.span,
843            });
844        };
845
846        self.next();
847        let function_node = match function {
848            FunctionKind::Closure(_) => {
849                let mut arguments = BumpVec::new_in(&self.bump);
850
851                arguments.push(expression_parser(ParserContext::Global));
852                if let Some(error) =
853                    self.expect(TokenKind::Operator(Operator::Comma))
854                {
855                    arguments.push(error);
856                };
857
858                arguments.push(self.closure(&expression_parser));
859                if let Some(error) =
860                    self.expect(TokenKind::Bracket(Bracket::RightParenthesis))
861                {
862                    arguments.push(error);
863                }
864
865                Node::FunctionCall {
866                    kind: function,
867                    arguments: self
868                        .bump
869                        .alloc_slice_copy(arguments.into_bump_slice()),
870                }
871            },
872            _ => {
873                let mut arguments = BumpVec::new_in(&self.bump);
874                loop {
875                    if self.current_kind()
876                        == Some(&TokenKind::Bracket(Bracket::RightParenthesis))
877                    {
878                        break;
879                    }
880
881                    arguments.push(expression_parser(ParserContext::Global));
882                    if self.current_kind()
883                        != Some(&TokenKind::Operator(Operator::Comma))
884                    {
885                        break;
886                    }
887
888                    if let Some(error) =
889                        self.expect(TokenKind::Operator(Operator::Comma))
890                    {
891                        arguments.push(error);
892                        break;
893                    }
894                }
895
896                if let Some(error) =
897                    self.expect(TokenKind::Bracket(Bracket::RightParenthesis))
898                {
899                    arguments.push(error);
900                }
901
902                Node::FunctionCall {
903                    kind: function,
904                    arguments: arguments.into_bump_slice(),
905                }
906            },
907        };
908
909        self.with_postfix(
910            self.node(function_node, |_| NodeMetadata {
911                span: (identifier_token.span.0, self.prev_token_end()),
912            }),
913            expression_parser,
914        )
915    }
916
917    /// Interval node
918    pub(crate) fn interval<F>(
919        &self,
920        expression_parser: F,
921    ) -> Option<&'arena Node<'arena>>
922    where
923        F: Fn(ParserContext) -> &'arena Node<'arena>,
924    {
925        // Performance optimisation: skip if expression does not contain an interval for faster evaluation
926        if !self.has_range_operator {
927            return None;
928        }
929
930        let TokenKind::Bracket(_) = &self.current()?.kind else {
931            return None;
932        };
933
934        let initial_position = self.position();
935        let TokenKind::Bracket(left_bracket) = &self.current()?.kind else {
936            self.set_position(initial_position);
937            return None;
938        };
939
940        self.next();
941        let left = expression_parser(ParserContext::Global);
942        if left.has_error() {
943            self.set_position(initial_position);
944            return None;
945        };
946
947        if let Some(_) = self.expect(TokenKind::Operator(Operator::Range)) {
948            self.set_position(initial_position);
949            return None;
950        };
951
952        let right = expression_parser(ParserContext::Global);
953        if right.has_error() {
954            self.set_position(initial_position);
955            return None;
956        };
957
958        let TokenKind::Bracket(right_bracket) = &self.current()?.kind else {
959            self.set_position(initial_position);
960            return None;
961        };
962
963        self.next();
964
965        let interval_node = self.node(
966            Node::Interval {
967                left,
968                right,
969                left_bracket: *left_bracket,
970                right_bracket: *right_bracket,
971            },
972            |_| NodeMetadata {
973                span: (initial_position as u32, self.position() as u32),
974            },
975        );
976
977        Some(self.with_postfix(interval_node, expression_parser))
978    }
979
980    /// Array nodes
981    pub(crate) fn array<F>(
982        &self,
983        expression_parser: F,
984    ) -> &'arena Node<'arena>
985    where
986        F: Fn(ParserContext) -> &'arena Node<'arena>,
987    {
988        let Some(current_token) = self.current() else {
989            return self.error(AstNodeError::MissingToken {
990                expected: afmt!(self, "Array"),
991                position: self.position(),
992            });
993        };
994
995        if current_token.kind != TokenKind::Bracket(Bracket::LeftSquareBracket)
996        {
997            return self.error(AstNodeError::UnexpectedToken {
998                expected: afmt!(
999                    self,
1000                    "{}",
1001                    TokenKind::Bracket(Bracket::LeftSquareBracket)
1002                ),
1003                received: afmt!(self, "{}", current_token.kind),
1004                span: current_token.span,
1005            });
1006        }
1007
1008        self.next();
1009        let mut nodes = BumpVec::new_in(self.bump);
1010        while !(self.current().map(|t| t.kind)
1011            == Some(TokenKind::Bracket(Bracket::RightSquareBracket)))
1012        {
1013            if !nodes.is_empty() {
1014                expect!(self, TokenKind::Operator(Operator::Comma));
1015                if self.current().map(|t| t.kind)
1016                    == Some(TokenKind::Bracket(Bracket::RightSquareBracket))
1017                {
1018                    break;
1019                }
1020            }
1021
1022            nodes.push(expression_parser(ParserContext::Global));
1023        }
1024
1025        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
1026
1027        let node = Node::Array(nodes.into_bump_slice());
1028
1029        self.with_postfix(
1030            self.node(node, |_| NodeMetadata {
1031                span: (current_token.span.0, self.prev_token_end()),
1032            }),
1033            expression_parser,
1034        )
1035    }
1036
1037    pub(crate) fn object<F>(
1038        &self,
1039        expression_parser: F,
1040    ) -> &'arena Node<'arena>
1041    where
1042        F: Fn(ParserContext) -> &'arena Node<'arena>,
1043    {
1044        let span_start = self.token_start();
1045        expect!(self, TokenKind::Bracket(Bracket::LeftCurlyBracket));
1046
1047        let mut key_value_pairs = BumpVec::new_in(self.bump);
1048        if let Some(TokenKind::Bracket(Bracket::RightCurlyBracket)) =
1049            self.current().map(|t| t.kind)
1050        {
1051            self.next();
1052            return self
1053                .node(Node::Object(key_value_pairs.into_bump_slice()), |_| {
1054                    NodeMetadata { span: (span_start, self.prev_token_end()) }
1055                });
1056        }
1057
1058        loop {
1059            let key = self.object_key(&expression_parser);
1060            expect!(self, TokenKind::Operator(Operator::Slice));
1061            let value = expression_parser(ParserContext::Global);
1062
1063            key_value_pairs.push((key, value));
1064
1065            let Some(current_token) = self.current() else {
1066                break;
1067            };
1068
1069            match current_token.kind {
1070                TokenKind::Operator(Operator::Comma) => {
1071                    expect!(self, TokenKind::Operator(Operator::Comma));
1072                },
1073                TokenKind::Bracket(Bracket::RightCurlyBracket) => break,
1074                _ => {
1075                    return self.error(AstNodeError::Custom {
1076                        message: afmt!(self, "Invalid object syntax"),
1077                        span: current_token.span,
1078                    });
1079                },
1080            }
1081        }
1082
1083        if let Some(error) =
1084            self.expect(TokenKind::Bracket(Bracket::RightCurlyBracket))
1085        {
1086            key_value_pairs.push((
1087                self.node(Node::Null, |_| NodeMetadata {
1088                    span: error.span().unwrap_or_default(),
1089                }),
1090                error,
1091            ));
1092        };
1093
1094        self.node(Node::Object(key_value_pairs.into_bump_slice()), |_| {
1095            NodeMetadata { span: (span_start, self.prev_token_end()) }
1096        })
1097    }
1098
1099    pub(crate) fn object_key<F>(
1100        &self,
1101        expression_parser: F,
1102    ) -> &'arena Node<'arena>
1103    where
1104        F: Fn(ParserContext) -> &'arena Node<'arena>,
1105    {
1106        let Some(key_token) = self.current() else {
1107            return self.error(AstNodeError::Custom {
1108                message: afmt!(self, "Expected an object key"),
1109                span: (self.prev_token_end(), self.prev_token_end()),
1110            });
1111        };
1112
1113        let key = match key_token.kind {
1114            TokenKind::Identifier(identifier) => {
1115                self.next();
1116                self.node(Node::String(identifier.into()), |_| NodeMetadata {
1117                    span: key_token.span,
1118                })
1119            }
1120            TokenKind::Boolean(boolean) => match boolean {
1121                true => {
1122                    self.next();
1123                    self.node(Node::String("true"), |_| NodeMetadata {
1124                        span: key_token.span,
1125                    })
1126                }
1127                false => {
1128                    self.next();
1129                    self.node(Node::String("false"), |_| NodeMetadata {
1130                        span: key_token.span,
1131                    })
1132                }
1133            },
1134            TokenKind::Number => {
1135                self.next();
1136                self.node(Node::String(key_token.value), |_| NodeMetadata {
1137                    span: key_token.span,
1138                })
1139            }
1140            TokenKind::Literal => {
1141                self.next();
1142                self.node(Node::String(key_token.value), |_| NodeMetadata {
1143                    span: key_token.span,
1144                })
1145            }
1146            TokenKind::Bracket(bracket) => match bracket {
1147                Bracket::LeftSquareBracket => {
1148                    expect!(self, TokenKind::Bracket(Bracket::LeftSquareBracket));
1149                    let token = expression_parser(ParserContext::Global);
1150                    expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
1151
1152                    token
1153                }
1154                _ => {
1155                    return self.error(AstNodeError::Custom {
1156                        message: afmt!(self, "Operator is not supported as object key"),
1157                        span: key_token.span,
1158                    })
1159                }
1160            },
1161            TokenKind::QuotationMark(qm) => match qm {
1162                QuotationMark::SingleQuote => self.simple_string(&QuotationMark::SingleQuote),
1163                QuotationMark::DoubleQuote => self.simple_string(&QuotationMark::DoubleQuote),
1164                QuotationMark::Backtick => {
1165                    return self.error(AstNodeError::Custom {
1166                        message: afmt!(
1167                            self,
1168                            "TemplateString expression not supported as object key"
1169                        ),
1170                        span: key_token.span,
1171                    })
1172                }
1173            },
1174            TokenKind::TemplateString(_) => {
1175                return self.error(AstNodeError::Custom {
1176                    message: afmt!(
1177                        self,
1178                        "TemplateString expression not supported as object key"
1179                    ),
1180                    span: key_token.span,
1181                })
1182            }
1183            TokenKind::Operator(_) => {
1184                return self.error(AstNodeError::Custom {
1185                    message: afmt!(self, "Operator is not supported as object key"),
1186                    span: key_token.span,
1187                })
1188            }
1189        };
1190
1191        key
1192    }
1193
1194    /// Conditional
1195    /// condition_node ? on_true : on_false
1196    pub(crate) fn conditional<F>(
1197        &self,
1198        condition: &'arena Node<'arena>,
1199        expression_parser: F,
1200    ) -> Option<&'arena Node<'arena>>
1201    where
1202        F: Fn(ParserContext) -> &'arena Node<'arena>,
1203    {
1204        let Some(current_token) = self.current() else {
1205            return None;
1206        };
1207        if current_token.kind != TokenKind::Operator(Operator::QuestionMark) {
1208            return None;
1209        }
1210
1211        self.next();
1212
1213        let on_true = expression_parser(ParserContext::Global);
1214        if let Some(error_node) =
1215            self.expect(TokenKind::Operator(Operator::Slice))
1216        {
1217            return Some(error_node);
1218        }
1219
1220        let on_false = expression_parser(ParserContext::Global);
1221
1222        let conditional_node =
1223            Node::Conditional { condition, on_true, on_false };
1224
1225        Some(self.node(conditional_node, |_| NodeMetadata {
1226            span: (current_token.span.0, self.prev_token_end()),
1227        }))
1228    }
1229
1230    /// Literal - number, string, array etc.
1231    pub(crate) fn literal<F>(
1232        &self,
1233        expression_parser: F,
1234    ) -> &'arena Node<'arena>
1235    where
1236        F: Fn(ParserContext) -> &'arena Node<'arena>,
1237    {
1238        let Some(current_token) = self.current() else {
1239            return self.error(AstNodeError::Custom {
1240                message: afmt!(self, "Expected a literal"),
1241                span: (self.prev_token_end(), self.prev_token_end()),
1242            });
1243        };
1244
1245        match &current_token.kind {
1246            TokenKind::Identifier(identifier) => match identifier {
1247                Identifier::Null => self.null(),
1248                _ => self.identifier(&expression_parser),
1249            },
1250            TokenKind::Literal => self.identifier(&expression_parser),
1251            TokenKind::Boolean(_) => self.bool(),
1252            TokenKind::Number => self.number(),
1253            TokenKind::QuotationMark(quote_mark) => match quote_mark {
1254                QuotationMark::SingleQuote | QuotationMark::DoubleQuote => {
1255                    self.simple_string(quote_mark)
1256                },
1257                QuotationMark::Backtick => {
1258                    self.template_string(&expression_parser)
1259                },
1260            },
1261            TokenKind::Bracket(bracket) => match bracket {
1262                Bracket::LeftParenthesis
1263                | Bracket::RightParenthesis
1264                | Bracket::RightSquareBracket => {
1265                    self.interval(&expression_parser).unwrap_or_else(|| {
1266                        self.error(AstNodeError::Custom {
1267                            message: afmt!(self, "Invalid syntax"),
1268                            span: (
1269                                self.prev_token_end(),
1270                                self.prev_token_end(),
1271                            ),
1272                        })
1273                    })
1274                },
1275                Bracket::LeftSquareBracket => self
1276                    .interval(&expression_parser)
1277                    .unwrap_or_else(|| self.array(&expression_parser)),
1278                Bracket::LeftCurlyBracket => self.object(&expression_parser),
1279                Bracket::RightCurlyBracket => {
1280                    self.error(AstNodeError::Custom {
1281                        message: afmt!(
1282                            self,
1283                            "Unexpected RightCurlyBracket token"
1284                        ),
1285                        span: current_token.span,
1286                    })
1287                },
1288            },
1289            TokenKind::Operator(_) => self.error(AstNodeError::Custom {
1290                message: afmt!(self, "Unexpected Operator token"),
1291                span: current_token.span,
1292            }),
1293            TokenKind::TemplateString(_) => self.error(AstNodeError::Custom {
1294                message: afmt!(self, "Unexpected TemplateString token"),
1295                span: current_token.span,
1296            }),
1297        }
1298    }
1299}
1300
1301fn is_valid_property(token: &Token) -> bool {
1302    match &token.kind {
1303        TokenKind::Identifier(_) => true,
1304        TokenKind::Literal => true,
1305        TokenKind::Operator(operator) => match operator {
1306            Operator::Logical(_) => true,
1307            Operator::Comparison(comparison) => {
1308                matches!(comparison, ComparisonOperator::In)
1309            },
1310            _ => false,
1311        },
1312        _ => false,
1313    }
1314}
1315
1316#[derive(Debug)]
1317enum PostfixKind {
1318    MemberAccess,
1319    PropertyAccess,
1320    Other,
1321}
1322
1323impl From<&Token<'_>> for PostfixKind {
1324    fn from(token: &Token) -> Self {
1325        match &token.kind {
1326            TokenKind::Bracket(Bracket::LeftSquareBracket) => {
1327                Self::PropertyAccess
1328            },
1329            TokenKind::Operator(Operator::Dot) => Self::MemberAccess,
1330            _ => Self::Other,
1331        }
1332    }
1333}
1334
1335pub(crate) struct MetadataHelper<'a, 'arena> {
1336    node_metadata: &'a HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>,
1337    arena: PhantomData<&'arena ()>,
1338}
1339
1340impl<'a, 'arena> MetadataHelper<'a, 'arena> {
1341    pub(crate) fn span(
1342        &self,
1343        left: &'arena Node<'arena>,
1344        right: &'arena Node<'arena>,
1345    ) -> Option<(u32, u32)> {
1346        Some((self.metadata(left)?.span.0, self.metadata(right)?.span.1))
1347    }
1348
1349    pub(crate) fn metadata(
1350        &self,
1351        n: &'arena Node<'arena>,
1352    ) -> Option<&NodeMetadata> {
1353        self.node_metadata.get(&self.address(n))
1354    }
1355
1356    fn address(
1357        &self,
1358        n: &'arena Node<'arena>,
1359    ) -> usize {
1360        n as *const Node as usize
1361    }
1362}
1363
1364#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1365pub(crate) enum ParserContext {
1366    Global,
1367    Closure,
1368}