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
21macro_rules! expect {
24 ($self:ident, $token:expr) => {
25 if let Some(error_node) = $self.expect($token) {
26 return error_node;
27 }
28 };
29}
30
31macro_rules! afmt {
34 ($self:expr, $($arg:tt)*) => {{
35 let formatted = format!($($arg)*);
36 $self.bump.alloc_str(formatted.as_str())
37 }}
38}
39
40#[derive(Debug)]
43pub struct BaseParser;
44
45#[derive(Debug)]
52pub struct Parser<'arena, 'token_ref, Flavor> {
53 tokens: &'token_ref [Token<'arena>], current: Cell<Option<&'token_ref Token<'arena>>>, pub(crate) bump: &'arena Bump, position: Cell<usize>, depth: Cell<u8>, marker_flavor: PhantomData<Flavor>, has_range_operator: bool, pub(crate) node_metadata:
61 Option<RefCell<HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>>>, }
63
64impl<'arena, 'token_ref> Parser<'arena, 'token_ref, BaseParser> {
65 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 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 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 pub fn with_metadata(mut self) -> Parser<'arena, 'token_ref, Flavor> {
129 self.node_metadata = Some(Default::default());
130 self
131 }
132
133 pub(crate) fn current(&self) -> Option<&Token<'arena>> {
135 self.current.get()
136 }
137
138 pub(crate) fn current_kind(&self) -> Option<&TokenKind> {
140 self.current.get().map(|token| &token.kind)
141 }
142
143 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 #[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 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 fn position(&self) -> usize {
174 self.position.get()
175 }
176
177 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 pub(crate) fn depth(&self) -> u8 {
192 self.depth.get()
193 }
194
195 pub(crate) fn is_done(&self) -> bool {
197 self.current.get().is_none()
198 }
199
200 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 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 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 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 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 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 },
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 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 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 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 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 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 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 ¤t_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}