1use crate::ast::{
2 ArrayLiteral, ArrowFunctionExpression, BinaryExpression, BlockStatement, DebuggerStatement,
3 DoWhileStatement, ExportDeclaration, ExpressionStatement, ForStatement, IfStatement,
4 ImportDeclaration, Node, ObjectLiteral, Position, Program, Property, ReturnStatement, Span,
5 SpreadElement, SwitchCase, SwitchStatement, TemplateElement, TemplateLiteral, WhileStatement,
6 WithStatement,
7};
8use crate::lexer::tokens::Keyword;
9use crate::lexer::{Lexer, Token, TokenKind};
10use crate::parser::error::{ParseResult, ParserError};
11use crate::parser::recovery::{ErrorRecovery, ParsingContext, RecoveryContext, RecoveryStrategy};
12
13pub struct Parser {
14 #[allow(dead_code)]
15 source: String,
16
17 lexer: Lexer,
18
19 pub current: Option<Token>,
20
21 previous: Option<Token>,
22
23 error_recovery: ErrorRecovery,
24
25 context: ParsingContext,
26
27 #[allow(dead_code)]
28 strict_mode: bool,
29}
30
31impl Parser {
32 pub fn new(source: &str) -> Self {
33 let mut lexer = Lexer::new(source);
34 let current = lexer.next_token().ok();
35
36 Self {
37 source: source.to_string(),
38 lexer,
39 current,
40 previous: None,
41 error_recovery: ErrorRecovery::default(),
42 context: ParsingContext::TopLevel,
43 strict_mode: false,
44 }
45 }
46
47 pub fn parse(&mut self) -> ParseResult<Node> {
48 self.parse_program()
49 }
50
51 pub fn parse_with_recovery(&mut self) -> (Option<Node>, Vec<ParserError>) {
52 match self.parse() {
53 Ok(ast) => (Some(ast), self.error_recovery.errors().to_vec()),
54 Err(error) => {
55 self.error_recovery.add_error(error);
56 (None, self.error_recovery.errors().to_vec())
57 }
58 }
59 }
60
61 fn parse_program(&mut self) -> ParseResult<Node> {
62 let mut body = Vec::new();
63 let start_pos = self.current_position();
64
65 if self.is_eof() {
66 let end_pos = self.previous_position();
67 let span = self.create_span(start_pos, end_pos);
68 return Ok(Node::Program(Program {
69 body,
70 source_type: "script".to_string(),
71 span: Some(span),
72 }));
73 }
74
75 while !self.is_eof() {
76 match self.parse_statement() {
77 Ok(stmt) => body.push(stmt),
78 Err(error) => {
79 if !self.try_recover_from_error(error.clone()) {
80 return Err(error);
81 }
82
83 if self.is_eof() {
84 break;
85 }
86 }
87 }
88 }
89
90 let end_pos = self.previous_position();
91 let span = self.create_span(start_pos, end_pos);
92
93 Ok(Node::Program(Program {
94 body,
95 source_type: "script".to_string(),
96 span: Some(span),
97 }))
98 }
99
100 fn parse_statement(&mut self) -> ParseResult<Node> {
101 let old_context = self.context.clone();
102 self.context = ParsingContext::Statement;
103
104 let result = if let Some(token) = &self.current {
105 match &token.kind {
106 TokenKind::Keyword(kw) => match kw.as_str() {
107 "let" | "const" | "var" => self.parse_declaration(),
108 "function" => self.parse_function_declaration(),
109 "class" => self.parse_class_declaration(),
110 "if" => self.parse_if_statement(),
111 "while" => self.parse_while_statement(),
112 "for" => self.parse_for_statement(),
113 "return" => self.parse_return_statement(),
114 "break" => self.parse_break_statement(),
115 "continue" => self.parse_continue_statement(),
116 "throw" => self.parse_throw_statement(),
117 "try" => self.parse_try_statement(),
118 "switch" => self.parse_switch_statement(),
119 "do" => self.parse_do_while_statement(),
120 "with" => self.parse_with_statement(),
121 "debugger" => self.parse_debugger_statement(),
122 "import" => self.parse_import_declaration(),
123 "export" => self.parse_export_declaration(),
124 _ => self.parse_expression_statement(),
125 },
126 TokenKind::LeftBrace => {
127 self.parse_block_statement()
130 }
131 TokenKind::Semicolon => self.parse_empty_statement(),
132 _ => self.parse_expression_statement(),
133 }
134 } else {
135 Err(ParserError::unexpected_end_of_input(None))
136 };
137
138 self.context = old_context;
139 result
140 }
141
142 fn parse_declaration(&mut self) -> ParseResult<Node> {
143 if let Some(token) = &self.current {
144 match &token.kind {
145 TokenKind::Keyword(kw) => match kw.as_str() {
146 "let" | "const" | "var" => self.parse_variable_declaration(),
147 "function" => self.parse_function_declaration(),
148 "class" => self.parse_class_declaration(),
149 _ => Err(ParserError::invalid_declaration(
150 "Expected declaration",
151 self.current_position().unwrap_or_default(),
152 )),
153 },
154 _ => Err(ParserError::invalid_declaration(
155 "Expected declaration",
156 self.current_position().unwrap_or_default(),
157 )),
158 }
159 } else {
160 Err(ParserError::unexpected_end_of_input(None))
161 }
162 }
163
164 fn parse_if_statement(&mut self) -> ParseResult<Node> {
165 self.advance();
166
167 self.expect(TokenKind::LeftParen)?;
168 let test = Box::new(self.parse_expression()?);
169 self.expect(TokenKind::RightParen)?;
170
171 let consequent = Box::new(self.parse_statement()?);
172
173 let alternate = if let Some(token) = &self.current {
174 if let TokenKind::Keyword(kw) = &token.kind {
175 if kw.matches_str("else") {
176 self.advance();
177 Some(Box::new(self.parse_statement()?))
178 } else {
179 None
180 }
181 } else {
182 None
183 }
184 } else {
185 None
186 };
187
188 let span = self.create_span_from_tokens();
189 Ok(Node::IfStatement(IfStatement {
190 test,
191 consequent,
192 alternate,
193 span: Some(span),
194 }))
195 }
196
197 fn parse_while_statement(&mut self) -> ParseResult<Node> {
198 self.advance();
199
200 self.expect(TokenKind::LeftParen)?;
201 let test = Box::new(self.parse_expression()?);
202 self.expect(TokenKind::RightParen)?;
203
204 let body = Box::new(self.parse_statement()?);
205
206 let span = self.create_span_from_tokens();
207 Ok(Node::WhileStatement(WhileStatement {
208 test,
209 body,
210 span: Some(span),
211 }))
212 }
213
214 fn parse_for_statement(&mut self) -> ParseResult<Node> {
215 self.advance(); self.expect(TokenKind::LeftParen)?;
218
219 let init = if self.check(TokenKind::Semicolon) {
221 None
222 } else if self.is_declaration() {
223 Some(Box::new(self.parse_variable_declaration_without_semicolon()?))
224 } else {
225 Some(Box::new(self.parse_expression()?))
226 };
227
228 self.expect(TokenKind::Semicolon)?;
229
230 let test = if self.check(TokenKind::Semicolon) {
232 None
233 } else {
234 Some(Box::new(self.parse_expression()?))
235 };
236
237 self.expect(TokenKind::Semicolon)?;
238
239 let update = if self.check(TokenKind::RightParen) {
241 None
242 } else {
243 Some(Box::new(self.parse_expression()?))
244 };
245
246 self.expect(TokenKind::RightParen)?;
247
248 let body = Box::new(self.parse_statement()?);
250
251 let span = self.create_span_from_tokens();
252 Ok(Node::ForStatement(ForStatement {
253 init,
254 test,
255 update,
256 body,
257 span: Some(span),
258 }))
259 }
260
261 fn parse_return_statement(&mut self) -> ParseResult<Node> {
262 self.advance();
263
264 let argument = if !self.check(TokenKind::Semicolon) && !self.is_eof() {
265 Some(Box::new(self.parse_expression()?))
266 } else {
267 None
268 };
269
270 let span = self.create_span_from_tokens();
271 Ok(Node::ReturnStatement(ReturnStatement {
272 argument,
273 span: Some(span),
274 }))
275 }
276
277 fn parse_switch_statement(&mut self) -> ParseResult<Node> {
278 self.advance();
279
280 self.expect(TokenKind::LeftParen)?;
281 let discriminant = Box::new(self.parse_expression()?);
282 self.expect(TokenKind::RightParen)?;
283
284 self.expect(TokenKind::LeftBrace)?;
285
286 let mut cases = Vec::new();
287 while !self.check(TokenKind::RightBrace) && !self.is_eof() {
288 cases.push(self.parse_switch_case()?);
289 }
290
291 self.expect(TokenKind::RightBrace)?;
292
293 let span = self.create_span_from_tokens();
294 Ok(Node::SwitchStatement(SwitchStatement {
295 discriminant,
296 cases,
297 span: Some(span),
298 }))
299 }
300
301 fn parse_switch_case(&mut self) -> ParseResult<SwitchCase> {
302 let test = if let Some(token) = &self.current {
303 if let TokenKind::Keyword(kw) = &token.kind {
304 if kw == "default" {
305 self.advance();
306 None
307 } else {
308 self.advance();
309 Some(Box::new(self.parse_expression()?))
310 }
311 } else {
312 self.advance();
313 Some(Box::new(self.parse_expression()?))
314 }
315 } else {
316 None
317 };
318
319 self.expect(TokenKind::Colon)?;
320
321 let mut consequent = Vec::new();
322 while !self.check(TokenKind::Keyword(Keyword::Case))
323 && !self.check(TokenKind::Keyword(Keyword::Default))
324 && !self.check(TokenKind::RightBrace)
325 && !self.is_eof()
326 {
327 consequent.push(self.parse_statement()?);
328 }
329
330 let span = self.create_span_from_tokens();
331 Ok(SwitchCase {
332 test,
333 consequent,
334 span: Some(span),
335 })
336 }
337
338 fn parse_do_while_statement(&mut self) -> ParseResult<Node> {
339 self.advance();
340
341 let body = Box::new(self.parse_statement()?);
342
343 if let Some(token) = &self.current {
344 if let TokenKind::Keyword(kw) = &token.kind {
345 if kw == "while" {
346 self.advance();
347 self.expect(TokenKind::LeftParen)?;
348 let test = Box::new(self.parse_expression()?);
349 self.expect(TokenKind::RightParen)?;
350
351 let span = self.create_span_from_tokens();
352 return Ok(Node::DoWhileStatement(DoWhileStatement {
353 body,
354 test,
355 span: Some(span),
356 }));
357 }
358 }
359 }
360
361 Err(ParserError::invalid_statement(
362 "Expected 'while' after 'do'",
363 self.current_position().unwrap_or_default(),
364 ))
365 }
366
367 fn parse_with_statement(&mut self) -> ParseResult<Node> {
368 self.advance();
369
370 self.expect(TokenKind::LeftParen)?;
371 let object = Box::new(self.parse_expression()?);
372 self.expect(TokenKind::RightParen)?;
373
374 let body = Box::new(self.parse_statement()?);
375
376 let span = self.create_span_from_tokens();
377 Ok(Node::WithStatement(WithStatement {
378 object,
379 body,
380 span: Some(span),
381 }))
382 }
383
384 fn parse_debugger_statement(&mut self) -> ParseResult<Node> {
385 self.advance();
386
387 let span = self.create_span_from_tokens();
388 Ok(Node::DebuggerStatement(DebuggerStatement {
389 span: Some(span),
390 }))
391 }
392
393 pub fn parse_block_statement(&mut self) -> ParseResult<Node> {
394 self.advance();
395
396 let old_context = self.context.clone();
397 self.context = ParsingContext::Block;
398
399 let mut body = Vec::new();
400 while !self.check(TokenKind::RightBrace) && !self.is_eof() {
401 match self.parse_statement() {
402 Ok(stmt) => body.push(stmt),
403 Err(error) => {
404 if !self.try_recover_from_error(error.clone()) {
405 self.context = old_context;
406 return Err(error);
407 }
408 }
409 }
410 }
411
412 self.expect(TokenKind::RightBrace)?;
413
414 self.context = old_context;
415
416 let span = self.create_span_from_tokens();
417 Ok(Node::BlockStatement(BlockStatement {
418 body,
419 span: Some(span),
420 }))
421 }
422
423 fn parse_empty_statement(&mut self) -> ParseResult<Node> {
424 self.advance();
425
426 let span = self.create_span_from_tokens();
427
428 Ok(Node::ExpressionStatement(ExpressionStatement {
429 expression: Box::new(Node::Null),
430 span: Some(span),
431 }))
432 }
433
434 fn parse_expression_statement(&mut self) -> ParseResult<Node> {
435 let expression = Box::new(self.parse_expression()?);
436
437 if self.check(TokenKind::Semicolon) {
438 self.advance();
439 }
440
441 let span = self.create_span_from_tokens();
442 Ok(Node::ExpressionStatement(ExpressionStatement {
443 expression,
444 span: Some(span),
445 }))
446 }
447
448 fn parse_import_declaration(&mut self) -> ParseResult<Node> {
449 self.advance();
450
451 let span = self.create_span_from_tokens();
452 Ok(Node::ImportDeclaration(ImportDeclaration {
453 specifiers: Vec::new(),
454 source: Box::new(Node::String("".to_string())),
455 span: Some(span),
456 }))
457 }
458
459 fn parse_export_declaration(&mut self) -> ParseResult<Node> {
460 self.advance();
461
462 let span = self.create_span_from_tokens();
463 Ok(Node::ExportDeclaration(ExportDeclaration {
464 declaration: None,
465 specifiers: Vec::new(),
466 source: None,
467 default: false,
468 span: Some(span),
469 }))
470 }
471
472 pub fn parse_expression(&mut self) -> ParseResult<Node> {
473 self.parse_assignment_expression()
474 }
475
476 pub fn parse_equality_expression(&mut self) -> ParseResult<Node> {
477 let mut left = self.parse_relational_expression()?;
478
479 while self.is_equality_operator() {
480 let operator = self.current_token_string();
481 self.advance();
482 let right = Box::new(self.parse_relational_expression()?);
483
484 let span = self.create_span_from_tokens();
485 left = Node::BinaryExpression(BinaryExpression {
486 left: Box::new(left),
487 operator,
488 right,
489 span: Some(span),
490 });
491 }
492
493 Ok(left)
494 }
495
496 pub fn parse_primary_expression(&mut self) -> ParseResult<Node> {
497 if let Some(token) = &self.current {
498 match &token.kind {
499 TokenKind::Number(n) => {
500 let value = *n;
501 self.advance();
502 Ok(Node::Number(value))
503 }
504 TokenKind::String(s) => {
505 let value = s.clone();
506 self.advance();
507 Ok(Node::String(value))
508 }
509 TokenKind::TemplateString(s) => {
510 let value = s.clone();
511 self.advance();
512
513 self.parse_template_literal(value)
514 }
515 TokenKind::Boolean(b) => {
516 let value = *b;
517 self.advance();
518 Ok(Node::Boolean(value))
519 }
520 TokenKind::Null => {
521 self.advance();
522 Ok(Node::Null)
523 }
524 TokenKind::Undefined => {
525 self.advance();
526 Ok(Node::Undefined)
527 }
528 TokenKind::Keyword(kw) if kw == "this" => {
529 self.advance();
530 Ok(Node::This)
531 }
532 TokenKind::LeftParen => {
533 self.advance();
534 let expr = self.parse_expression()?;
535 self.expect(TokenKind::RightParen)?;
536 Ok(expr)
537 }
538 TokenKind::LeftBracket => self.parse_array_literal(),
539 TokenKind::LeftBrace => self.parse_object_literal(),
540 TokenKind::Keyword(kw) if kw == "function" => self.parse_function_expression(),
541 TokenKind::Keyword(kw) if kw == "class" => self.parse_class_expression(),
542 TokenKind::Keyword(kw) if kw == "new" => self.parse_new_expression(),
543 TokenKind::Keyword(kw) if kw == "async" => {
544 self.advance();
545 if self.check(TokenKind::Keyword(Keyword::Function)) {
546 self.parse_function_expression()
547 } else {
548 self.parse_arrow_function_expression(true)
549 }
550 }
551 _ => {
552 if self.check_identifier() {
553 self.parse_identifier()
554 } else {
555 Err(ParserError::invalid_expression(
556 "Unexpected token in expression",
557 self.current_position().unwrap_or_default(),
558 ))
559 }
560 }
561 }
562 } else {
563 Err(ParserError::unexpected_end_of_input(None))
564 }
565 }
566
567 pub fn parse_parameters(&mut self) -> ParseResult<Vec<Node>> {
568 let mut params = Vec::new();
569
570 while !self.check(TokenKind::RightParen) && !self.is_eof() {
571 params.push(self.parse_identifier()?);
572
573 if self.check(TokenKind::Comma) {
574 self.advance();
575 }
576 }
577
578 Ok(params)
579 }
580
581 pub fn parse_arguments(&mut self) -> ParseResult<Vec<Node>> {
582 let mut arguments = Vec::new();
583
584 while !self.check(TokenKind::RightParen) && !self.is_eof() {
585 arguments.push(self.parse_expression()?);
586
587 if self.check(TokenKind::Comma) {
588 self.advance();
589 }
590 }
591
592 Ok(arguments)
593 }
594
595 pub fn parse_function_body(&mut self) -> ParseResult<Node> {
596 self.parse_block_statement()
597 }
598
599 pub fn parse_class_body(&mut self) -> ParseResult<Node> {
600 self.expect(TokenKind::LeftBrace)?;
601
602 let mut body = Vec::new();
603 while !self.check(TokenKind::RightBrace) && !self.is_eof() {
604 body.push(self.parse_statement()?);
605 }
606
607 self.expect(TokenKind::RightBrace)?;
608
609 let span = self.create_span_from_tokens();
610 Ok(Node::BlockStatement(BlockStatement {
611 body,
612 span: Some(span),
613 }))
614 }
615
616 pub fn parse_identifier(&mut self) -> ParseResult<Node> {
617 if let Some(token) = &self.current {
618 if let TokenKind::Identifier(ident) = &token.kind {
619 let name = ident.clone();
620 self.advance();
621 Ok(Node::Identifier(name))
622 } else {
623 Err(ParserError::invalid_syntax(
624 "Expected identifier",
625 self.current_position().unwrap_or_default(),
626 ))
627 }
628 } else {
629 Err(ParserError::unexpected_end_of_input(None))
630 }
631 }
632
633 fn current_token(&self) -> Option<&Token> {
634 self.current.as_ref()
635 }
636
637 pub fn current_token_string(&self) -> String {
638 if let Some(token) = &self.current {
639 match &token.kind {
640 TokenKind::Plus => "+".to_string(),
641 TokenKind::Minus => "-".to_string(),
642 TokenKind::Star => "*".to_string(),
643 TokenKind::Slash => "/".to_string(),
644 TokenKind::Percent => "%".to_string(),
645 TokenKind::StarStar => "**".to_string(),
646 TokenKind::Equal => "==".to_string(),
647 TokenKind::NotEqual => "!=".to_string(),
648 TokenKind::StrictEqual => "===".to_string(),
649 TokenKind::StrictNotEqual => "!==".to_string(),
650 TokenKind::LessThan => "<".to_string(),
651 TokenKind::GreaterThan => ">".to_string(),
652 TokenKind::LessThanEqual => "<=".to_string(),
653 TokenKind::GreaterThanEqual => ">=".to_string(),
654 TokenKind::LeftShift => "<<".to_string(),
655 TokenKind::RightShift => ">>".to_string(),
656 TokenKind::UnsignedRightShift => ">>>".to_string(),
657 TokenKind::Assign => "=".to_string(),
658 TokenKind::PlusAssign => "+=".to_string(),
659 TokenKind::MinusAssign => "-=".to_string(),
660 TokenKind::StarAssign => "*=".to_string(),
661 TokenKind::SlashAssign => "/=".to_string(),
662 TokenKind::PercentAssign => "%=".to_string(),
663 TokenKind::StarStarAssign => "**=".to_string(),
664 TokenKind::LeftShiftAssign => "<<=".to_string(),
665 TokenKind::RightShiftAssign => ">>=".to_string(),
666 TokenKind::UnsignedRightShiftAssign => ">>>=".to_string(),
667 TokenKind::BitwiseAndAssign => "&=".to_string(),
668 TokenKind::BitwiseOrAssign => "|=".to_string(),
669 TokenKind::BitwiseXorAssign => "^=".to_string(),
670 TokenKind::LogicalAnd => "&&".to_string(),
671 TokenKind::LogicalOr => "||".to_string(),
672 TokenKind::Exclamation => "!".to_string(),
673 TokenKind::BitwiseAnd => "&".to_string(),
674 TokenKind::BitwiseOr => "|".to_string(),
675 TokenKind::BitwiseXor => "^".to_string(),
676 TokenKind::Tilde => "~".to_string(),
677 TokenKind::Increment => "++".to_string(),
678 TokenKind::Decrement => "--".to_string(),
679 TokenKind::Question => "?".to_string(),
680 TokenKind::Colon => ":".to_string(),
681 TokenKind::Comma => ",".to_string(),
682 TokenKind::Semicolon => ";".to_string(),
683 TokenKind::Dot => ".".to_string(),
684 TokenKind::LeftParen => "(".to_string(),
685 TokenKind::RightParen => ")".to_string(),
686 TokenKind::LeftBracket => "[".to_string(),
687 TokenKind::RightBracket => "]".to_string(),
688 TokenKind::LeftBrace => "{".to_string(),
689 TokenKind::RightBrace => "}".to_string(),
690 TokenKind::Arrow => "=>".to_string(),
691 TokenKind::Spread => "...".to_string(),
692 TokenKind::NullishCoalescing => "??".to_string(),
693 TokenKind::OptionalChaining => "?.".to_string(),
694 TokenKind::Identifier(id) => id.clone(),
695 TokenKind::String(s) => s.clone(),
696 TokenKind::Number(n) => n.to_string(),
697 TokenKind::Keyword(kw) => kw.as_str().to_string(),
698 TokenKind::Boolean(b) => b.to_string(),
699 TokenKind::Eof => "EOF".to_string(),
700 _ => format!("{:?}", token.kind),
701 }
702 } else {
703 "EOF".to_string()
704 }
705 }
706
707 pub fn check(&self, token_kind: TokenKind) -> bool {
708 if let Some(token) = &self.current {
709 std::mem::discriminant(&token.kind) == std::mem::discriminant(&token_kind)
710 } else {
711 false
712 }
713 }
714
715 pub fn check_identifier(&self) -> bool {
716 self.current_token()
717 .map(|t| t.is_identifier())
718 .unwrap_or(false)
719 }
720
721 pub fn expect(&mut self, token_kind: TokenKind) -> ParseResult<()> {
722 if self.check(token_kind.clone()) {
723 self.advance();
724 Ok(())
725 } else {
726 let _current = self
727 .current_token()
728 .map(|t| format!("{:?}", t.kind))
729 .unwrap_or_else(|| "EOF".to_string());
730 Err(ParserError::unexpected_token(
731 self.current_token()
732 .unwrap_or_else(|| panic!("No current token")),
733 Some(&format!("{token_kind:?}")),
734 ))
735 }
736 }
737
738 pub fn advance(&mut self) {
739 self.previous = self.current.take();
740 self.current = self.lexer.next_token().ok();
741 }
742
743 pub fn is_eof(&self) -> bool {
744 self.current.is_none()
745 || matches!(self.current.as_ref().map(|t| &t.kind), Some(TokenKind::Eof))
746 }
747
748 pub fn current_position(&self) -> Option<Position> {
749 self.current.as_ref().map(|t| Position {
750 line: t.start().line,
751 column: t.start().column,
752 })
753 }
754
755 fn previous_position(&self) -> Option<Position> {
756 self.previous.as_ref().map(|t| Position {
757 line: t.end().line,
758 column: t.end().column,
759 })
760 }
761
762 pub fn create_span_from_tokens(&self) -> Span {
763 let start = self.previous_position().unwrap_or_default();
764 let end = self.current_position().unwrap_or_default();
765 Span::new(start, end)
766 }
767
768 fn create_span(&self, start: Option<Position>, end: Option<Position>) -> Span {
769 let start = start.unwrap_or_default();
770 let end = end.unwrap_or_default();
771 Span::new(start, end)
772 }
773
774 fn is_declaration(&self) -> bool {
775 if let Some(token) = &self.current {
776 matches!(token.kind,
777 TokenKind::Keyword(ref kw) if kw == "let" || kw == "const" || kw == "var" || kw == "function" || kw == "class"
778 )
779 } else {
780 false
781 }
782 }
783
784 pub fn is_assignment_operator(&self) -> bool {
785 if let Some(token) = &self.current {
786 matches!(
787 token.kind,
788 TokenKind::Assign
789 | TokenKind::PlusAssign
790 | TokenKind::MinusAssign
791 | TokenKind::StarAssign
792 | TokenKind::SlashAssign
793 | TokenKind::PercentAssign
794 | TokenKind::StarStarAssign
795 | TokenKind::LeftShiftAssign
796 | TokenKind::RightShiftAssign
797 | TokenKind::UnsignedRightShiftAssign
798 | TokenKind::BitwiseAndAssign
799 | TokenKind::BitwiseOrAssign
800 | TokenKind::BitwiseXorAssign
801 )
802 } else {
803 false
804 }
805 }
806
807 pub fn is_relational_operator(&self) -> bool {
808 if let Some(token) = &self.current {
809 matches!(
810 token.kind,
811 TokenKind::LessThan
812 | TokenKind::GreaterThan
813 | TokenKind::LessThanEqual
814 | TokenKind::GreaterThanEqual
815 ) || matches!(token.kind, TokenKind::Keyword(ref kw) if kw == "instanceof" || kw == "in")
816 } else {
817 false
818 }
819 }
820
821 pub fn is_shift_operator(&self) -> bool {
822 if let Some(token) = &self.current {
823 matches!(
824 token.kind,
825 TokenKind::LeftShift | TokenKind::RightShift | TokenKind::UnsignedRightShift
826 )
827 } else {
828 false
829 }
830 }
831
832 pub fn is_additive_operator(&self) -> bool {
833 if let Some(token) = &self.current {
834 matches!(token.kind, TokenKind::Plus | TokenKind::Minus)
835 } else {
836 false
837 }
838 }
839
840 pub fn is_multiplicative_operator(&self) -> bool {
841 if let Some(token) = &self.current {
842 matches!(
843 token.kind,
844 TokenKind::Star | TokenKind::Slash | TokenKind::Percent
845 )
846 } else {
847 false
848 }
849 }
850
851 pub fn is_exponentiation_operator(&self) -> bool {
852 if let Some(token) = &self.current {
853 matches!(token.kind, TokenKind::StarStar)
854 } else {
855 false
856 }
857 }
858
859 pub fn is_unary_operator(&self) -> bool {
860 if let Some(token) = &self.current {
861 matches!(
862 token.kind,
863 TokenKind::Plus | TokenKind::Minus | TokenKind::Exclamation | TokenKind::Tilde
864 ) || matches!(token.kind, TokenKind::Keyword(ref kw) if kw == "typeof" || kw == "void" || kw == "delete")
865 } else {
866 false
867 }
868 }
869
870 fn try_recover_from_error(&mut self, error: ParserError) -> bool {
871 if !self.error_recovery.can_recover() {
872 return false;
873 }
874
875 self.error_recovery.add_error(error);
876
877 let context = RecoveryContext::new(
878 self.current.clone(),
879 self.previous.clone(),
880 self.context.clone(),
881 );
882
883 let strategy = context.determine_strategy();
884
885 match strategy {
886 RecoveryStrategy::SkipUntil(tokens) => {
887 while !self.is_eof() {
888 if let Some(token) = self.current_token() {
889 if tokens
890 .iter()
891 .any(|t| format!("{:?}", token.kind).contains(t))
892 {
893 break;
894 }
895 }
896 self.advance();
897 }
898 true
899 }
900
901 RecoveryStrategy::SkipUntilStatement => {
902 while !self.is_eof() {
903 if let Some(token) = self.current_token() {
904 match token.kind {
905 TokenKind::Semicolon | TokenKind::RightBrace => break,
906 _ => self.advance(),
907 }
908 } else {
909 break;
910 }
911 }
912 true
913 }
914
915 RecoveryStrategy::SkipUntilBlock => {
916 while !self.is_eof() {
917 if let Some(token) = self.current_token() {
918 if matches!(token.kind, TokenKind::RightBrace) {
919 break;
920 }
921 }
922 self.advance();
923 }
924 true
925 }
926
927 RecoveryStrategy::SkipUntilFunction => {
928 while !self.is_eof() {
929 if let Some(token) = self.current_token() {
930 match token.kind {
931 TokenKind::RightBrace | TokenKind::Semicolon => break,
932 _ => self.advance(),
933 }
934 } else {
935 break;
936 }
937 }
938 true
939 }
940
941 RecoveryStrategy::SkipUntilClass => {
942 while !self.is_eof() {
943 if let Some(token) = self.current_token() {
944 if matches!(token.kind, TokenKind::RightBrace) {
945 break;
946 }
947 }
948 self.advance();
949 }
950 true
951 }
952
953 RecoveryStrategy::SkipUntilModule => {
954 while !self.is_eof() {
955 let should_break = if let Some(token) = &self.current {
956 matches!(token.kind, TokenKind::RightBrace)
957 || matches!(token.kind, TokenKind::Keyword(ref kw) if kw == "import" || kw == "export")
958 } else {
959 false
960 };
961
962 if should_break {
963 break;
964 }
965 self.advance();
966 }
967 true
968 }
969
970 RecoveryStrategy::InsertToken(_) => {
971 self.advance();
972 true
973 }
974
975 RecoveryStrategy::ReplaceToken(_) => {
976 self.advance();
977 true
978 }
979
980 RecoveryStrategy::DeleteToken => {
981 self.advance();
982 true
983 }
984
985 RecoveryStrategy::NoRecovery => false,
986 }
987 }
988
989 fn parse_arrow_function_expression(&mut self, is_async: bool) -> ParseResult<Node> {
990 let mut params = Vec::new();
991
992 if self.check(TokenKind::LeftParen) {
993 self.advance();
994 if !self.check(TokenKind::RightParen) {
995 params = self.parse_parameters()?;
996 }
997 self.expect(TokenKind::RightParen)?;
998 } else {
999 params.push(self.parse_identifier()?);
1000 }
1001
1002 self.expect(TokenKind::Arrow)?;
1003
1004 let body = if self.check(TokenKind::LeftBrace) {
1005 Box::new(self.parse_function_body()?)
1006 } else {
1007 Box::new(self.parse_expression()?)
1008 };
1009
1010 let span = self.create_span_from_tokens();
1011 Ok(Node::ArrowFunctionExpression(ArrowFunctionExpression {
1012 params,
1013 body,
1014 expression: !self.check(TokenKind::LeftBrace),
1015 r#async: is_async,
1016 span: Some(span),
1017 }))
1018 }
1019
1020 pub fn parse_destructuring_pattern(&mut self) -> ParseResult<Node> {
1021 if self.check(TokenKind::LeftBrace) {
1022 self.advance();
1023 let mut properties = Vec::new();
1024
1025 while !self.check(TokenKind::RightBrace) && !self.is_eof() {
1026 if self.check_identifier() {
1027 let key = self.parse_identifier()?;
1028 let value = if self.check(TokenKind::Colon) {
1029 self.advance();
1030 Some(Box::new(self.parse_expression()?))
1031 } else {
1032 None
1033 };
1034
1035 let span = self.create_span_from_tokens();
1036 let is_shorthand = value.is_none();
1037 properties.push(Node::Property(Property {
1038 key: Box::new(key),
1039 value: value.unwrap_or_else(|| Box::new(Node::Identifier("".to_string()))),
1040 kind: "init".to_string(),
1041 computed: false,
1042 method: false,
1043 shorthand: is_shorthand,
1044 span: Some(span),
1045 }));
1046 } else if self.check(TokenKind::Spread) {
1047 self.advance();
1048 let argument = Box::new(self.parse_expression()?);
1049 let span = self.create_span_from_tokens();
1050 properties.push(Node::SpreadElement(SpreadElement {
1051 argument,
1052 span: Some(span),
1053 }));
1054 }
1055
1056 if self.check(TokenKind::Comma) {
1057 self.advance();
1058 } else {
1059 break;
1060 }
1061 }
1062
1063 self.expect(TokenKind::RightBrace)?;
1064
1065 let span = self.create_span_from_tokens();
1066 Ok(Node::ObjectLiteral(ObjectLiteral {
1067 properties,
1068 span: Some(span),
1069 }))
1070 } else if self.check(TokenKind::LeftBracket) {
1071 self.advance();
1072 let mut elements = Vec::new();
1073
1074 while !self.check(TokenKind::RightBracket) && !self.is_eof() {
1075 if self.check(TokenKind::Comma) {
1076 elements.push(None);
1077 self.advance();
1078 } else if self.check(TokenKind::Spread) {
1079 self.advance();
1080 let argument = Box::new(self.parse_expression()?);
1081 let span = self.create_span_from_tokens();
1082 elements.push(Some(Node::SpreadElement(SpreadElement {
1083 argument,
1084 span: Some(span),
1085 })));
1086 } else {
1087 elements.push(Some(self.parse_expression()?));
1088 }
1089
1090 if self.check(TokenKind::Comma) {
1091 self.advance();
1092 } else {
1093 break;
1094 }
1095 }
1096
1097 self.expect(TokenKind::RightBracket)?;
1098
1099 let span = self.create_span_from_tokens();
1100 Ok(Node::ArrayLiteral(ArrayLiteral {
1101 elements,
1102 span: Some(span),
1103 }))
1104 } else {
1105 self.parse_identifier()
1106 }
1107 }
1108
1109 fn parse_template_literal(&mut self, initial_value: String) -> ParseResult<Node> {
1110 let mut quasis = Vec::new();
1111 let mut expressions = Vec::new();
1112
1113 quasis.push(TemplateElement {
1114 value: initial_value,
1115 tail: false,
1116 span: None,
1117 });
1118
1119 while !self.check(TokenKind::TemplateEnd) && !self.is_eof() {
1120 if self.check(TokenKind::TemplateExpr) {
1121 self.advance();
1122 let expr = self.parse_expression()?;
1123 expressions.push(expr);
1124
1125 if self.check(TokenKind::RightBrace) {
1126 self.advance();
1127 } else {
1128 return Err(ParserError::unexpected_token(
1129 self.current_token().unwrap(),
1130 Some("Expected '}' in template expression"),
1131 ));
1132 }
1133 } else if let TokenKind::TemplateString(value) = &self.current_token().unwrap().kind {
1134 let value = value.clone();
1135 self.advance();
1136 quasis.push(TemplateElement {
1137 value,
1138 tail: false,
1139 span: None,
1140 });
1141 } else {
1142 break;
1143 }
1144 }
1145
1146 if self.check(TokenKind::TemplateEnd) {
1147 self.advance();
1148
1149 if let Some(last_quasi) = quasis.last_mut() {
1150 last_quasi.tail = true;
1151 }
1152 }
1153
1154 let span = self.create_span_from_tokens();
1155 Ok(Node::TemplateLiteral(TemplateLiteral {
1156 quasis,
1157 expressions,
1158 span: Some(span),
1159 }))
1160 }
1161}