1use thiserror::Error;
4
5use crate::utils::Join;
6
7use super::{
8 ast::*,
9 lexer::LexerError,
10 token::{LiteralKind, Token, TokenKind, TokenType},
11};
12
13macro_rules! unexpected_token_error {
14 ($self:expr) => {
15 return Err(ParserError::UnexpectedToken {
16 token: Box::new($self.token.clone()),
17 expected: $self.expected_tokens.clone(),
18 })
19 };
20}
21
22pub struct Parser<'a> {
24 pub token: Token,
26 pub prev_token: Token,
28 pub token_iter: &'a mut dyn Iterator<Item = Token>,
30 pub is_eof: bool,
32
33 expected_tokens: Vec<TokenType>,
34}
35
36impl<'a> Parser<'a> {
37 pub fn new(token_iter: &'a mut dyn Iterator<Item = Token>) -> Self {
39 let mut parser = Parser {
40 token: Token::dummy(),
41 prev_token: Token::dummy(),
42 token_iter,
43 is_eof: false,
44 expected_tokens: Vec::new(),
45 };
46 parser.bump();
47 parser
48 }
49
50 fn bump(&mut self) {
52 self.prev_token = self.token.clone();
53 self.token = self.token_iter.next().unwrap_or_else(|| {
54 self.is_eof = true;
55 Token::dummy()
56 });
57 self.expected_tokens.clear();
58 }
59
60 fn eat_eol(&mut self) {
62 while self.token.kind == TokenKind::EOL {
63 self.bump();
64 }
65 }
66
67 fn expect(&mut self, t: &TokenKind) -> Result<(), ParserError> {
69 if self.token.kind == *t {
70 self.bump();
71 Ok(())
72 } else if self.is_eof {
73 Err(ParserError::UnexpectedEOF)
74 } else {
75 self.expected_tokens.push(TokenType::Token(t.clone()));
76 unexpected_token_error!(self)
77 }
78 }
79
80 fn check(&mut self, t: &TokenKind) -> bool {
83 let is_present = self.token.kind == *t;
84 if !is_present {
85 self.expected_tokens.push(TokenType::Token(t.clone()));
86 }
87 is_present
88 }
89
90 fn check_noexpect(&self, t: &TokenKind) -> bool {
91 self.token.kind == *t
92 }
93
94 fn eat(&mut self, t: &TokenKind) -> bool {
96 let is_present = self.check(t);
97 if is_present {
98 self.bump()
99 }
100 is_present
101 }
102
103 fn eat_noexpect(&mut self, t: &TokenKind) -> bool {
104 let is_present = self.check_noexpect(t);
105 if is_present {
106 self.bump()
107 }
108 is_present
109 }
110
111 fn eat_ident(&mut self) -> Option<String> {
112 if let TokenKind::Ident(v) = self.token.kind.clone() {
113 self.bump();
114 Some(v)
115 } else {
116 self.expected_tokens.push(TokenType::Literal);
117 None
118 }
119 }
120
121 fn eat_literal(&mut self) -> Option<LiteralKind> {
122 if let TokenKind::Literal(v) = self.token.kind.clone() {
123 self.bump();
124 Some(v)
125 } else {
126 self.expected_tokens.push(TokenType::Literal);
127 None
128 }
129 }
130
131 pub fn parse(&mut self) -> Result<Box<Block>, ParserError> {
133 Ok(Box::new(Block {
134 start: self.token.start,
135 body: {
136 let mut temp = Vec::new();
137 while !self.is_eof {
138 temp.push(self.parse_stmt()?);
139 if self.is_eof {
140 break;
141 }
142 self.expect(&TokenKind::EOL)?;
143 self.eat_eol();
144 }
145 temp
146 },
147 end: self.prev_token.end,
148 }))
149 }
150
151 fn parse_stmt(&mut self) -> Result<Stmt, ParserError> {
153 macro_rules! stmt {
154 ($kind:expr) => {
155 Stmt {
156 start: self.prev_token.start,
157 kind: $kind,
158 end: self.prev_token.end,
159 }
160 };
161 }
162 macro_rules! check_assign_left {
163 ($ast_node:expr) => {
164 match $ast_node.kind {
165 ExprKind::Ident(_) => (),
166 ExprKind::Member { safe, .. } | ExprKind::MetaMember { safe, .. } => {
167 if safe {
168 return Err(ParserError::ParseAssignStmtError);
169 }
170 }
171 _ => return Err(ParserError::ParseAssignStmtError),
172 }
173 };
174 }
175 macro_rules! assign_op_stmt {
176 ($ast_node:expr, $bin_op:expr) => {{
177 check_assign_left!($ast_node);
178 let right = self.parse_expr(1)?;
179 Stmt {
180 start: $ast_node.start,
181 end: right.end,
182 kind: StmtKind::AssignOp {
183 operator: $bin_op,
184 left: $ast_node,
185 right,
186 },
187 }
188 }};
189 }
190 self.eat_eol();
191 let ast_node = if self.eat(&TokenKind::If) {
192 self.parse_stmt_if()?
193 } else if self.eat(&TokenKind::Loop) {
194 stmt!(StmtKind::Loop {
195 body: self.parse_block()?,
196 })
197 } else if self.eat(&TokenKind::While) {
198 stmt!(StmtKind::While {
199 test: self.parse_expr(1)?,
200 body: self.parse_block()?,
201 })
202 } else if self.eat(&TokenKind::For) {
203 stmt!(StmtKind::For {
204 left: {
205 let mut temp = Vec::new();
206 while !self.eat_noexpect(&TokenKind::In) {
207 temp.push(self.parse_ident()?);
208 if self.eat(&TokenKind::In) {
209 break;
210 }
211 self.expect(&TokenKind::Comma)?;
212 }
213 temp
214 },
215 right: self.parse_expr(1)?,
216 body: self.parse_block()?,
217 })
218 } else if self.eat(&TokenKind::Break) {
219 stmt!(StmtKind::Break)
220 } else if self.eat(&TokenKind::Continue) {
221 stmt!(StmtKind::Continue)
222 } else if self.eat(&TokenKind::Return) {
223 stmt!(StmtKind::Return {
224 argument: self.parse_expr(1)?,
225 })
226 } else if self.eat(&TokenKind::Throw) {
227 stmt!(StmtKind::Throw {
228 argument: self.parse_expr(1)?,
229 })
230 } else if self.eat(&TokenKind::Global) {
231 stmt!(StmtKind::Global {
232 arguments: {
233 let mut temp = Vec::new();
234 while !self.check_noexpect(&TokenKind::EOL) {
235 temp.push(self.parse_ident()?);
236 if self.check(&TokenKind::EOL) {
237 break;
238 }
239 self.expect(&TokenKind::Comma)?;
240 }
241 temp
242 },
243 })
244 } else if self.eat(&TokenKind::Import) {
245 stmt!({
246 let mut path = Vec::new();
247 let mut glob = false;
248 loop {
249 if self.check_noexpect(&TokenKind::EOL)
250 | self.check_noexpect(&TokenKind::As)
251 | self.check_noexpect(&TokenKind::OpenBrace)
252 {
253 break;
254 } else if self.eat_noexpect(&TokenKind::Mul) {
255 glob = true;
256 break;
257 }
258 path.push(self.parse_ident()?);
259 if self.check(&TokenKind::EOL)
260 | self.check(&TokenKind::As)
261 | self.check(&TokenKind::OpenBrace)
262 {
263 break;
264 }
265 self.expect(&TokenKind::DoubleColon)?;
266 }
267 if path.is_empty() {
268 self.expected_tokens = vec![TokenType::Ident];
269 unexpected_token_error!(self);
270 }
271 let kind = if glob {
272 ImportKind::Glob
273 } else if self.check(&TokenKind::EOL) {
274 ImportKind::Simple(Box::new(path.last().unwrap().clone()))
275 } else if self.eat(&TokenKind::As) {
276 ImportKind::Simple(Box::new(self.parse_ident()?))
277 } else if self.eat(&TokenKind::OpenBrace) {
278 let mut temp = Vec::new();
279 while !self.eat_noexpect(&TokenKind::CloseBrace) {
280 let t = self.parse_ident()?;
281 if self.eat(&TokenKind::As) {
282 temp.push((t, self.parse_ident()?));
283 } else {
284 temp.push((t.clone(), t));
285 }
286 self.eat_eol();
287 if self.eat(&TokenKind::CloseBrace) {
288 break;
289 }
290 self.expect(&TokenKind::Comma)?;
291 self.eat_eol();
292 }
293 ImportKind::Nested(temp)
294 } else {
295 unexpected_token_error!(self);
296 };
297 StmtKind::Import { path, kind }
298 })
299 } else if self.check(&TokenKind::OpenBrace) {
300 (*self.parse_block()?).into()
301 } else if self.eat(&TokenKind::Fn) {
302 stmt!(StmtKind::Assign {
303 left: Box::new(self.parse_ident()?.into()),
304 right: self.parse_expr_func(false)?
305 })
306 } else {
307 let ast_node = self.parse_expr(1)?;
308 if self.check(&TokenKind::Comma) {
309 check_assign_left!(ast_node);
310 let start = ast_node.start;
311 let mut left = vec![*ast_node];
312 loop {
313 if self.eat(&TokenKind::Comma) {
314 let ast_node = self.parse_expr(1)?;
315 check_assign_left!(ast_node);
316 left.push(*ast_node);
317 } else {
318 self.expect(&TokenKind::Assign)?;
319 break;
320 }
321 }
322 let right = self.parse_expr(1)?;
323 if self.check_noexpect(&TokenKind::Comma) {
324 let mut right = vec![*right];
325 loop {
326 if self.eat(&TokenKind::Comma) {
327 right.push(*self.parse_expr(1)?);
328 } else {
329 break;
330 }
331 }
332 if left.len() != right.len() {
333 return Err(ParserError::ParseAssignStmtError);
334 }
335 Stmt {
336 start,
337 end: self.prev_token.end,
338 kind: StmtKind::AssignMulti { left, right },
339 }
340 } else {
341 Stmt {
342 start,
343 end: right.end,
344 kind: StmtKind::AssignUnpack { left, right },
345 }
346 }
347 } else if self.eat(&TokenKind::Assign) {
348 check_assign_left!(ast_node);
349 let right = self.parse_expr(1)?;
350 Stmt {
351 start: ast_node.start,
352 end: right.end,
353 kind: StmtKind::Assign {
354 left: ast_node,
355 right,
356 },
357 }
358 } else if self.eat(&TokenKind::AddAssign) {
359 assign_op_stmt!(ast_node, BinOp::Add)
360 } else if self.eat(&TokenKind::SubAssign) {
361 assign_op_stmt!(ast_node, BinOp::Sub)
362 } else if self.eat(&TokenKind::MulAssign) {
363 assign_op_stmt!(ast_node, BinOp::Mul)
364 } else if self.eat(&TokenKind::DivAssign) {
365 assign_op_stmt!(ast_node, BinOp::Div)
366 } else if self.eat(&TokenKind::ModAssign) {
367 assign_op_stmt!(ast_node, BinOp::Mod)
368 } else {
369 Stmt {
370 start: ast_node.start,
371 end: ast_node.end,
372 kind: StmtKind::Expr(ast_node),
373 }
374 }
375 };
376 Ok(ast_node)
377 }
378
379 fn parse_block(&mut self) -> Result<Box<Block>, ParserError> {
381 self.expect(&TokenKind::OpenBrace)?;
382 self.eat_eol();
383 Ok(Box::new(Block {
384 start: self.prev_token.start,
385 body: {
386 let mut temp = Vec::new();
387 while !self.eat_noexpect(&TokenKind::CloseBrace) {
388 temp.push(self.parse_stmt()?);
389 if self.eat(&TokenKind::CloseBrace) {
390 break;
391 }
392 self.expect(&TokenKind::EOL)?;
393 self.eat_eol();
394 }
395 temp
396 },
397 end: self.prev_token.end,
398 }))
399 }
400
401 fn parse_stmt_if(&mut self) -> Result<Stmt, ParserError> {
403 Ok(Stmt {
404 start: self.prev_token.start,
405 kind: StmtKind::If {
406 test: self.parse_expr(1)?,
407 consequent: self.parse_block()?,
408 alternate: {
409 if self.eat(&TokenKind::Else) {
410 Some(Box::new(if self.eat(&TokenKind::If) {
411 self.parse_stmt_if()?
412 } else {
413 (*self.parse_block()?).into()
414 }))
415 } else {
416 None
417 }
418 },
419 },
420 end: self.prev_token.end,
421 })
422 }
423
424 fn parse_expr(&mut self, min_precedence: u32) -> Result<Box<Expr>, ParserError> {
426 let start = self.token.start;
427 let mut left = self.parse_expr_unary()?;
428 loop {
429 let operator = match self.token.kind {
430 TokenKind::Is => BinOp::Is,
431 TokenKind::And => BinOp::And,
432 TokenKind::Or => BinOp::Or,
433 TokenKind::Eq => BinOp::Eq,
434 TokenKind::NotEq => BinOp::Ne,
435 TokenKind::LtEq => BinOp::Le,
436 TokenKind::GtEq => BinOp::Ge,
437 TokenKind::Lt => BinOp::Lt,
438 TokenKind::Gt => BinOp::Gt,
439 TokenKind::Add => BinOp::Add,
440 TokenKind::Sub => BinOp::Sub,
441 TokenKind::Mul => BinOp::Mul,
442 TokenKind::Div => BinOp::Div,
443 TokenKind::Mod => BinOp::Mod,
444 _ => break,
445 };
446 if operator.precedence() < min_precedence {
447 break;
448 }
449 self.bump();
450 let right = self.parse_expr(operator.precedence() + 1)?;
451 left = Box::new(Expr {
452 kind: ExprKind::Binary {
453 operator,
454 left,
455 right,
456 },
457 start,
458 end: self.prev_token.end,
459 })
460 }
461 Ok(left)
462 }
463
464 fn parse_expr_unary(&mut self) -> Result<Box<Expr>, ParserError> {
466 macro_rules! unary_expr {
467 ($un_op:expr) => {{
468 Ok(Box::new(Expr {
469 start: self.token.start,
470 kind: ExprKind::Unary {
471 operator: $un_op,
472 argument: self.parse_expr_primary()?,
473 },
474 end: self.prev_token.end,
475 }))
476 }};
477 }
478 if self.eat_noexpect(&TokenKind::Not) {
479 unary_expr!(UnOp::Not)
480 } else if self.eat_noexpect(&TokenKind::Sub) {
481 unary_expr!(UnOp::Neg)
482 } else {
483 self.parse_expr_primary()
484 }
485 }
486
487 fn parse_expr_primary(&mut self) -> Result<Box<Expr>, ParserError> {
489 let start = self.token.start;
490 let mut ast_node = self.parse_expr_atom()?;
491 macro_rules! member_attr_expr {
492 ($member_expr_kind:expr, $safe:expr) => {
493 if self.eat_noexpect(&TokenKind::Pound) {
494 Box::new(Expr {
495 kind: ExprKind::MetaMember {
496 table: ast_node,
497 safe: $safe,
498 },
499 start,
500 end: self.prev_token.end,
501 })
502 } else {
503 Box::new(Expr {
504 kind: ExprKind::Member {
505 table: ast_node,
506 kind: $member_expr_kind,
507 safe: $safe,
508 property: Box::new(self.parse_ident()?.into()),
509 },
510 start,
511 end: self.prev_token.end,
512 })
513 }
514 };
515 }
516 macro_rules! member_item_expr {
517 ($safe:expr) => {
518 if self.eat_noexpect(&TokenKind::Pound) {
519 Box::new(Expr {
520 kind: ExprKind::MetaMember {
521 table: ast_node,
522 safe: $safe,
523 },
524 start: {
525 self.expect(&TokenKind::CloseBracket)?;
526 start
527 },
528 end: self.prev_token.end,
529 })
530 } else {
531 Box::new(Expr {
532 kind: ExprKind::Member {
533 table: ast_node,
534 kind: MemberKind::Bracket,
535 safe: $safe,
536 property: self.parse_expr(1)?,
537 },
538 start: {
539 self.expect(&TokenKind::CloseBracket)?;
540 start
541 },
542 end: self.prev_token.end,
543 })
544 }
545 };
546 }
547 loop {
548 ast_node = if self.eat_noexpect(&TokenKind::OpenParen) {
549 Box::new(Expr {
550 kind: ExprKind::Call {
551 callee: ast_node,
552 arguments: {
553 let mut temp = Vec::new();
554 while !self.eat_noexpect(&TokenKind::CloseParen) {
555 temp.push(*self.parse_expr(1)?);
556 self.eat_eol();
557 if self.eat(&TokenKind::CloseParen) {
558 break;
559 }
560 self.expect(&TokenKind::Comma)?;
561 self.eat_eol();
562 }
563 temp
564 },
565 propagating_error: false,
566 },
567 start,
568 end: self.prev_token.end,
569 })
570 } else if self.eat_noexpect(&TokenKind::OpenBracket) {
571 member_item_expr!(false)
572 } else if self.eat_noexpect(&TokenKind::Dot) {
573 member_attr_expr!(MemberKind::Dot, false)
574 } else if self.eat_noexpect(&TokenKind::DoubleColon) {
575 member_attr_expr!(MemberKind::DoubleColon, false)
576 } else if self.eat_noexpect(&TokenKind::Question) {
577 if self.eat(&TokenKind::OpenBracket) {
578 member_item_expr!(true)
579 } else if self.eat(&TokenKind::Dot) {
580 member_attr_expr!(MemberKind::Dot, true)
581 } else if self.eat(&TokenKind::DoubleColon) {
582 member_attr_expr!(MemberKind::DoubleColon, true)
583 } else {
584 unexpected_token_error!(self);
585 }
586 } else {
587 break;
588 };
589 }
590 Ok(ast_node)
591 }
592
593 fn parse_expr_atom(&mut self) -> Result<Box<Expr>, ParserError> {
595 macro_rules! lit_expr {
596 ($lit_kind:expr) => {{
597 Ok(Box::new(Expr::from(Lit {
598 value: $lit_kind,
599 start: self.token.start,
600 end: self.token.end,
601 })))
602 }};
603 }
604 if self.eat(&TokenKind::OpenParen) {
605 let temp = self.parse_expr(1)?;
606 self.expect(&TokenKind::CloseParen)?;
607 Ok(temp)
608 } else if self.eat(&TokenKind::Null) {
609 lit_expr!(LitKind::Null)
610 } else if self.eat(&TokenKind::True) {
611 lit_expr!(LitKind::Bool(true))
612 } else if self.eat(&TokenKind::False) {
613 lit_expr!(LitKind::Bool(false))
614 } else if let Some(v) = self.eat_literal() {
615 lit_expr!(match v {
616 LiteralKind::Int(v) => LitKind::Int(v?),
617 LiteralKind::Float(v) => LitKind::Float(v?),
618 LiteralKind::Str(v) => LitKind::Str(v?),
619 })
620 } else if self.eat(&TokenKind::OpenBrace) {
621 self.parse_expr_table()
622 } else if self.eat(&TokenKind::OpenBracket) {
623 self.parse_expr_list()
624 } else if self.eat(&TokenKind::Fn) {
625 self.parse_expr_func(false)
626 } else if self.eat(&TokenKind::VBar) {
627 self.parse_expr_func(true)
628 } else if self.eat(&TokenKind::Do) {
629 Ok(Box::new(Expr {
630 start: self.prev_token.start,
631 kind: ExprKind::Function {
632 kind: FunctionKind::Do,
633 params: Vec::new(),
634 variadic: None,
635 body: self.parse_block()?,
636 },
637 end: self.prev_token.end,
638 }))
639 } else if self.eat(&TokenKind::Try) {
640 let mut temp = self.parse_expr_primary()?;
641 if let ExprKind::Call {
642 propagating_error, ..
643 } = &mut temp.kind
644 {
645 *propagating_error = true;
646 } else {
647 return Err(ParserError::ParseTryExprError);
648 }
649 Ok(temp)
650 } else {
651 Ok(Box::new(self.parse_ident()?.into()))
652 }
653 }
654
655 fn parse_expr_table(&mut self) -> Result<Box<Expr>, ParserError> {
657 Ok(Box::new(Expr {
658 start: self.prev_token.start,
659 kind: ExprKind::Table {
660 properties: {
661 let mut temp = Vec::new();
662 self.eat_eol();
663 while !self.eat_noexpect(&TokenKind::CloseBrace) {
664 let start = self.token.start;
665 let key = self.parse_expr(1)?;
666 self.expect(&TokenKind::Colon)?;
667 let value = self.parse_expr(1)?;
668 temp.push(TableProperty {
669 key,
670 value,
671 start,
672 end: self.prev_token.end,
673 });
674 self.eat_eol();
675 if self.eat(&TokenKind::CloseBrace) {
676 break;
677 }
678 self.expect(&TokenKind::Comma)?;
679 self.eat_eol();
680 }
681 temp
682 },
683 },
684 end: self.prev_token.end,
685 }))
686 }
687
688 fn parse_expr_list(&mut self) -> Result<Box<Expr>, ParserError> {
690 Ok(Box::new(Expr {
691 start: self.prev_token.start,
692 kind: ExprKind::List {
693 items: {
694 let mut temp = Vec::new();
695 self.eat_eol();
696 while !self.eat_noexpect(&TokenKind::CloseBracket) {
697 temp.push(*self.parse_expr(1)?);
698 self.eat_eol();
699 if self.eat(&TokenKind::CloseBracket) {
700 break;
701 }
702 self.expect(&TokenKind::Comma)?;
703 self.eat_eol();
704 }
705 temp
706 },
707 },
708 end: self.prev_token.end,
709 }))
710 }
711
712 fn parse_expr_func(&mut self, is_closure: bool) -> Result<Box<Expr>, ParserError> {
714 let start = self.prev_token.start;
715 let end_token = if is_closure {
716 TokenKind::VBar
717 } else {
718 self.expect(&TokenKind::OpenParen)?;
719 TokenKind::CloseParen
720 };
721 let mut variadic = None;
722 Ok(Box::new(Expr {
723 start,
724 kind: ExprKind::Function {
725 kind: if is_closure {
726 FunctionKind::Closure
727 } else {
728 FunctionKind::Function
729 },
730 params: {
731 let mut temp = Vec::new();
732 while !self.eat_noexpect(&end_token) {
733 if self.eat_noexpect(&TokenKind::Mul) {
734 variadic = Some(Box::new(self.parse_ident()?));
735 self.expect(&end_token)?;
736 break;
737 }
738 temp.push(self.parse_ident()?);
739 self.eat_eol();
740 if self.eat(&end_token) {
741 break;
742 }
743 self.expect(&TokenKind::Comma)?;
744 self.eat_eol();
745 }
746 temp
747 },
748 variadic,
749 body: self.parse_block()?,
750 },
751 end: self.prev_token.end,
752 }))
753 }
754
755 fn parse_ident(&mut self) -> Result<Ident, ParserError> {
757 if let Some(v) = self.eat_ident() {
758 Ok(Ident {
759 start: self.token.start,
760 name: v,
761 end: self.token.end,
762 })
763 } else {
764 unexpected_token_error!(self)
765 }
766 }
767}
768
769#[derive(Error, Debug, Clone, PartialEq)]
771pub enum ParserError {
772 #[error("unexpected token (expected {}, found {token})", .expected.iter().join(", "))]
773 UnexpectedToken {
774 token: Box<Token>,
775 expected: Vec<TokenType>,
776 },
777 #[error("unexpected EOF")]
778 UnexpectedEOF,
779 #[error("parse assign statement error")]
780 ParseAssignStmtError,
781 #[error("parse try expression error")]
782 ParseTryExprError,
783 #[error(transparent)]
784 LexerError(#[from] LexerError),
785}