1use std::{mem, result};
2
3use crate::{
4 error::{Error, Result, Span},
5 lexer::Lexer,
6 nodes::*,
7 tokens::{Token, TokenKind},
8};
9
10macro_rules! syntax_err {
11 ($self:ident, $($arg:tt)*) => {
12 error!(SyntaxError, $self.curr_tok.span, $($arg)*)
13 };
14}
15
16macro_rules! expect {
17 ($self:ident, $kind:ident, $name:expr) => {
18 if !of_kinds!($self, $kind) {
19 $self.errors.push(error_val!(
20 SyntaxError,
21 $self.curr_tok.span,
22 "Expected {}, found '{}'",
23 $name,
24 $self.curr_tok.value(),
25 ));
26 }
27 $self.advance();
28 };
29}
30
31macro_rules! expect_ident {
32 ($self:ident) => {{
33 if !of_kinds!($self, Identifier) {
34 $self.errors.push(error_val!(
35 SyntaxError,
36 $self.curr_tok.span,
37 "Expected identifier, found '{}'",
38 $self.curr_tok.value(),
39 ));
40 }
41 let ident = $self.curr_tok.value.take().unwrap_or_default();
42 $self.advance();
43 ident
44 }};
45}
46
47macro_rules! expect_eol {
48 ($self:ident) => {
49 if of_kinds!($self, Semicolon) {
50 $self.advance();
51 } else if $self.prev_tok.kind != TokenKind::Eol {
52 $self.errors.push(error_val!(
53 SyntaxError,
54 $self.curr_tok.span,
55 "Expected ';' or line break, found '{}'",
56 $self.curr_tok.value(),
57 ));
58 }
59 };
60}
61
62macro_rules! of_kinds {
63 ($self:ident, Eol, Semicolon) => {{
64 of_kinds!(@skip $self);
65 $self.prev_tok.kind == TokenKind::Eol
66 || $self.curr_tok.kind == TokenKind::Semicolon
67 }};
68 ($self:ident, $kind:ident) => {{
69 of_kinds!(@skip $self);
70 $self.curr_tok.kind == TokenKind::$kind
71 }};
72 ($self:ident, $($kind:ident),+ $(,)?) => {{
73 of_kinds!(@skip $self);
74 [$(TokenKind::$kind, )*].contains(&$self.curr_tok.kind)
75 }};
76 (@skip $self:ident) => {
77 while $self.curr_tok.kind == TokenKind::Eol {
78 $self.advance();
79 }
80 };
81}
82
83macro_rules! simple_expr {
84 ($name:ident -> $type:ident : $($tok:ident),+ => $next:ident $kind:tt) => {
85 fn $name(&mut self, expects_stmt: bool) -> Result<$type> {
86 let start = self.curr_tok.span.start;
87 simple_expr!(@kind self, start, expects_stmt, $type, $($tok),+ | $next, $kind)
88 }
89 };
90 (@kind $self:ident, $start:ident, $expects_stmt:ident, $type:ident, $($tok:ident),+ | $next:ident, *) => {{
91 let base = $self.$next($expects_stmt)?;
92 let mut following = vec![];
93 while of_kinds!($self, $($tok),+) {
94 following.push(simple_expr!(@inner $self, $next, $($tok),+));
95 }
96 done!($type, $start, $self; base, following)
97 }};
98 (@kind $self:ident, $start:ident, $expects_stmt:ident, $type:ident, $($tok:ident),+ | $next:ident, ?) => {{
99 let left = $self.$next($expects_stmt)?;
100 let right = if of_kinds!($self, $($tok),+) {
101 Some(simple_expr!(@inner $self, $next, $($tok),+))
102 } else {
103 None
104 };
105 done!($type, $start, $self; left, right)
106 }};
107 (@inner $self:ident, $next:ident, $_:ident) => {{
108 $self.advance();
109 $self.$next(false)?
110 }};
111 (@inner $self:ident, $next:ident, $($_:ident),+) => {{
112 let tok = $self.curr_tok.kind;
113 $self.advance();
114 (tok, $self.$next(false)?)
115 }};
116}
117
118macro_rules! done {
119 ($type:ident, $start:ident, $self:ident; $($tt:tt)*) => {
120 Ok($type {
121 span: Span::new($start, $self.prev_tok.span.end),
122 $($tt)*
123 })
124 };
125}
126
127pub struct Parser<'i> {
128 lexer: Lexer<'i>,
129 prev_tok: Token,
130 curr_tok: Token,
131 errors: Vec<Error>,
132}
133
134impl<'i> Parser<'i> {
135 pub fn new(lexer: Lexer<'i>) -> Self {
136 Self {
137 lexer,
138 prev_tok: Token::dummy(),
139 curr_tok: Token::dummy(),
140 errors: vec![],
141 }
142 }
143
144 pub fn parse(&mut self) -> result::Result<Program, Vec<Error>> {
145 self.advance();
146 let statements = match Self::program(self) {
147 Ok(statements) => statements,
148 Err(error) => {
149 self.errors.push(error);
150 return Err(mem::take(&mut self.errors));
151 }
152 };
153
154 if !of_kinds!(self, Eof) {
155 self.errors
156 .push(error_val!(SyntaxError, self.curr_tok.span, "Expected EOF",));
157 }
158 if !self.errors.is_empty() {
159 return Err(mem::take(&mut self.errors));
160 }
161 Ok(statements)
162 }
163
164 fn advance(&mut self) {
165 mem::swap(&mut self.prev_tok, &mut self.curr_tok);
166 self.curr_tok = match self.lexer.next_token() {
167 Ok(token) => token,
168 Err((error, token)) => {
169 self.errors.push(error);
170 token
171 }
172 };
173 }
174
175 #[inline]
178 fn program(&mut self) -> Result<Program> {
179 self.statements()
180 }
181
182 fn statements(&mut self) -> Result<Statements> {
183 let mut stmts = vec![];
184 if !of_kinds!(self, RBrace, Eof) {
185 stmts.push(self.statement()?);
186 while of_kinds!(self, Eol, Semicolon) {
187 if self.curr_tok.kind == TokenKind::Semicolon {
188 self.advance();
189 }
190 if of_kinds!(self, RBrace, Eof) {
191 break;
192 }
193 stmts.push(self.statement()?);
194 }
195 }
196
197 Ok(stmts)
198 }
199
200 fn block(&mut self) -> Result<Block> {
201 if of_kinds!(self, LBrace) {
202 Ok(self.block_expr()?)
203 } else {
204 Ok(vec![self.statement()?])
205 }
206 }
207
208 fn statement(&mut self) -> Result<Statement> {
209 Ok(match self.curr_tok.kind {
210 TokenKind::Var => Statement::Var(self.var_stmt()?),
211 TokenKind::Fun => Statement::Function(self.function_decl()?),
212 TokenKind::Class => Statement::Class(self.class_decl()?),
213 TokenKind::Break => Statement::Break(self.break_stmt()?),
214 TokenKind::Continue => Statement::Continue(self.continue_stmt()?),
215 TokenKind::Return => Statement::Return(self.return_stmt()?),
216 _ => Statement::Expr(self.expression(true)?),
217 })
218 }
219
220 fn var_stmt(&mut self) -> Result<VarStmt> {
221 let start = self.curr_tok.span.start;
222
223 expect!(self, Var, "'var'");
224 let ident = expect_ident!(self);
225
226 let expr = if of_kinds!(self, Assign) {
227 self.advance();
228 Some(self.expression(false)?)
229 } else {
230 None
231 };
232
233 done!(VarStmt, start, self; ident, expr)
234 }
235
236 fn function_decl(&mut self) -> Result<FunctionDecl> {
237 let start = self.curr_tok.span.start;
238
239 expect!(self, Fun, "'fun'");
240 let ident = expect_ident!(self);
241 let args = self.params()?;
242 let block = self.block()?;
243
244 done!(FunctionDecl, start, self; ident, args, block)
245 }
246
247 fn class_decl(&mut self) -> Result<ClassDecl> {
248 let start = self.curr_tok.span.start;
249
250 expect!(self, Class, "'class'");
251 let ident = expect_ident!(self);
252 let block = self.member_block()?;
253
254 done!(ClassDecl, start, self; ident, block)
255 }
256
257 fn break_stmt(&mut self) -> Result<BreakStmt> {
258 let start = self.curr_tok.span.start;
259
260 expect!(self, Break, "'break'");
261 let expr = if !of_kinds!(self, Eof, Eol, RBrace) {
262 Some(self.expression(false)?)
263 } else {
264 None
265 };
266
267 done!(BreakStmt, start, self; expr)
268 }
269
270 fn continue_stmt(&mut self) -> Result<ContinueStmt> {
271 let start = self.curr_tok.span.start;
272
273 expect!(self, Continue, "'continue'");
274
275 done!(ContinueStmt, start, self;)
276 }
277 fn return_stmt(&mut self) -> Result<ReturnStmt> {
278 let start = self.curr_tok.span.start;
279
280 expect!(self, Return, "'return'");
281 let expr = if !of_kinds!(self, Eof, Eol, RBrace) {
282 Some(self.expression(false)?)
283 } else {
284 None
285 };
286
287 done!(ReturnStmt, start, self; expr)
288 }
289
290 fn member(&mut self) -> Result<Member> {
291 let start = self.curr_tok.span.start;
292
293 let is_static = of_kinds!(self, Static);
294 if is_static {
295 self.advance();
296 }
297 let kind = if of_kinds!(self, Var) {
298 MemberKind::Attribute(self.var_stmt()?)
299 } else {
300 MemberKind::Method(self.function_decl()?)
301 };
302
303 done!(Member, start, self; is_static, kind)
304 }
305
306 fn member_block(&mut self) -> Result<MemberBlock> {
307 let start = self.curr_tok.span.start;
308
309 expect!(self, LBrace, "'{'");
310 let mut members = vec![];
311 while !of_kinds!(self, RBrace, Eof) {
312 members.push(self.member()?);
313 expect_eol!(self);
314 }
315 expect!(self, RBrace, "'}'");
316
317 done!(MemberBlock, start, self; members)
318 }
319
320 #[inline]
321 fn expression(&mut self, expects_stmt: bool) -> Result<Expression> {
322 self.range_expr(expects_stmt)
323 }
324
325 fn range_expr(&mut self, expects_stmt: bool) -> Result<RangeExpr> {
326 let start = self.curr_tok.span.start;
327
328 if of_kinds!(self, Dots, DotsInclusive) {
329 let tok = self.curr_tok.kind;
330 self.advance();
331 if of_kinds!(self, RParen, RBrack, RBrace, Comma, Eof)
332 || of_kinds!(self, Eol, Semicolon)
333 {
334 if tok == TokenKind::DotsInclusive {
335 self.errors.push(error_val!(
336 SyntaxError,
337 self.curr_tok.span,
338 "Open ended range must be constructed with '..' not '..='",
339 ));
340 }
341 Ok(RangeExpr::Open)
342 } else {
343 let right = Box::new(self.or_expr(expects_stmt)?);
344 Ok(RangeExpr::OpenStart(
345 tok,
346 right,
347 Span::new(start, self.prev_tok.span.end),
348 ))
349 }
350 } else {
351 let left = Box::new(self.or_expr(expects_stmt)?);
352 if !of_kinds!(self, Dots, DotsInclusive) {
353 Ok(RangeExpr::None(left))
354 } else {
355 let tok = self.curr_tok.kind;
356 self.advance();
357 if of_kinds!(self, RParen, RBrack, RBrace, Comma, Eof)
358 || of_kinds!(self, Eol, Semicolon)
359 {
360 if tok == TokenKind::DotsInclusive {
361 self.errors.push(error_val!(
362 SyntaxError,
363 self.curr_tok.span,
364 "Open ended range must be constructed with '..' not '..='",
365 ));
366 }
367 Ok(RangeExpr::OpenEnd(
368 left,
369 Span::new(start, self.prev_tok.span.end),
370 ))
371 } else {
372 let right = Box::new(self.or_expr(expects_stmt)?);
373 Ok(RangeExpr::Closed(
374 left,
375 tok,
376 right,
377 Span::new(start, self.prev_tok.span.end),
378 ))
379 }
380 }
381 }
382 }
383
384 simple_expr!(or_expr -> OrExpr: Or => and_expr *);
385 simple_expr!(and_expr -> AndExpr: And => bit_or_expr *);
386 simple_expr!(bit_or_expr -> BitOrExpr: BitOr => bit_xor_expr *);
387 simple_expr!(bit_xor_expr -> BitXorExpr: BitXor => bit_and_expr *);
388 simple_expr!(bit_and_expr -> BitAndExpr: BitAnd => eq_expr *);
389 simple_expr!(eq_expr -> EqExpr: Equal, NotEqual => rel_expr ?);
390 simple_expr!(rel_expr -> RelExpr: LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual => shift_expr ?);
391 simple_expr!(shift_expr -> ShiftExpr: ShiftLeft, ShiftRight => add_expr *);
392 simple_expr!(add_expr -> AddExpr: Plus, Minus => mul_expr *);
393 simple_expr!(mul_expr -> MulExpr: Star, Slash, Rem, Backslash => unary_expr *);
394
395 fn unary_expr(&mut self, expects_stmt: bool) -> Result<UnaryExpr> {
396 let start = self.curr_tok.span.start;
397
398 if of_kinds!(self, Plus, Minus, Not) {
399 let operator = self.curr_tok.kind;
400 self.advance();
401 let expr = Box::new(self.unary_expr(false)?);
402 Ok(UnaryExpr::Unary {
403 span: Span::new(start, self.prev_tok.span.end),
404 operator,
405 expr,
406 })
407 } else {
408 Ok(UnaryExpr::Done(Box::new(self.exp_expr(expects_stmt)?)))
409 }
410 }
411
412 fn exp_expr(&mut self, expects_stmt: bool) -> Result<ExpExpr> {
413 let start = self.curr_tok.span.start;
414
415 let base = self.assign_expr(expects_stmt)?;
416 let exponent = if of_kinds!(self, Pow) {
417 self.advance();
418 Some(self.unary_expr(false)?)
419 } else {
420 None
421 };
422
423 done!(ExpExpr, start, self; base, exponent)
424 }
425
426 fn assign_expr(&mut self, expects_stmt: bool) -> Result<AssignExpr> {
427 let start = self.curr_tok.span.start;
428
429 let left = self.call_expr(expects_stmt)?;
430 let right = if of_kinds!(
431 self,
432 Assign,
433 StarAssign,
434 SlashAssign,
435 BackslashAssign,
436 RemAssign,
437 PlusAssign,
438 MinusAssign,
439 ShiftLeftAssign,
440 ShiftRightAssign,
441 BitAndAssign,
442 BitXorAssign,
443 BitOrAssign,
444 ) {
445 let tok = self.curr_tok.kind;
446 self.advance();
447 Some((tok, self.expression(false)?))
448 } else {
449 None
450 };
451
452 done!(AssignExpr, start, self; left, right)
453 }
454
455 fn call_expr(&mut self, expects_stmt: bool) -> Result<CallExpr> {
456 let start = self.curr_tok.span.start;
457
458 let base = self.member_expr(expects_stmt)?;
459 let mut following = vec![];
460 if of_kinds!(self, LParen) {
461 following.push(CallPart::Args(self.args()?));
462 while of_kinds!(self, LParen, Dot, LBrack) {
463 following.push(self.call_part()?);
464 }
465 }
466
467 done!(CallExpr, start, self; base, following)
468 }
469
470 fn member_expr(&mut self, expects_stmt: bool) -> Result<MemberExpr> {
471 let start = self.curr_tok.span.start;
472
473 let base = self.atom(expects_stmt)?;
474 let mut following = vec![];
475 while of_kinds!(self, Dot, LBrack) {
476 following.push(self.member_part()?);
477 }
478
479 done!(MemberExpr, start, self; base, following)
480 }
481
482 fn atom(&mut self, expects_stmt: bool) -> Result<Atom> {
483 let start = self.curr_tok.span.start;
484
485 Ok(match self.curr_tok.kind {
486 TokenKind::Number => {
487 let num = self.curr_tok.take_value();
488 self.advance();
489 Atom::Number(match num.parse() {
490 Ok(num) => num,
491 Err(rust_decimal::Error::ErrorString(msg)) => {
492 error!(ValueError, (start, self.prev_tok.span.end), "{}", msg);
493 }
494 Err(rust_decimal::Error::ExceedsMaximumPossibleValue) => {
495 error!(
496 ValueError,
497 (start, self.prev_tok.span.end),
498 "Value too high"
499 );
500 }
501 Err(rust_decimal::Error::LessThanMinimumPossibleValue) => {
502 error!(ValueError, (start, self.prev_tok.span.end), "Value too low");
503 }
504 Err(rust_decimal::Error::ScaleExceedsMaximumPrecision(_)) => {
505 error!(
506 ValueError,
507 (start, self.prev_tok.span.end),
508 "Value too precise"
509 );
510 }
511 Err(_) => error!(
512 ValueError,
513 (start, self.prev_tok.span.end),
514 "Failed to parse number"
515 ),
516 })
517 }
518 TokenKind::True => {
519 self.advance();
520 Atom::Bool(true)
521 }
522 TokenKind::False => {
523 self.advance();
524 Atom::Bool(false)
525 }
526 TokenKind::String => {
527 let str = self.curr_tok.take_value();
528 self.advance();
529 Atom::String(str)
530 }
531 TokenKind::Null => {
532 self.advance();
533 Atom::Null
534 }
535 TokenKind::Identifier => {
536 let name = self.curr_tok.take_value();
537 self.advance();
538 Atom::Identifier {
539 span: Span::new(start, self.prev_tok.span.end),
540 name,
541 }
542 }
543 TokenKind::LParen => {
544 self.advance();
545 let expr = self.expression(false)?;
546 expect!(self, RParen, "')'");
547 Atom::Expr(expr)
548 }
549 TokenKind::LBrack => Atom::List(self.list_literal()?),
550 TokenKind::If => Atom::IfExpr(self.if_expr()?),
551 TokenKind::For => Atom::ForExpr(self.for_expr()?),
552 TokenKind::While => Atom::WhileExpr(self.while_expr()?),
553 TokenKind::Loop => Atom::LoopExpr(self.loop_expr()?),
554 TokenKind::Fun => Atom::FunExpr(self.fun_expr()?),
555 TokenKind::Class => Atom::ClassExpr(self.class_expr()?),
556 TokenKind::Try => Atom::TryExpr(self.try_expr()?),
557 TokenKind::LBrace => Atom::BlockExpr(self.block_expr()?),
558 _ => syntax_err!(
559 self,
560 "Expected {}, found '{}'",
561 if expects_stmt {
562 "statement"
563 } else {
564 "expression"
565 },
566 self.curr_tok.value(),
567 ),
568 })
569 }
570
571 fn list_literal(&mut self) -> Result<ListLiteral> {
572 expect!(self, LBrack, "'['");
573 let mut exprs = vec![];
574 if !of_kinds!(self, RBrack) {
575 exprs.push(self.expression(false)?);
576 while of_kinds!(self, Comma) {
577 self.advance();
578 if of_kinds!(self, RBrack) {
579 break;
580 }
581 exprs.push(self.expression(false)?);
582 }
583 }
584 expect!(self, RBrack, "']'");
585
586 Ok(exprs)
587 }
588
589 fn if_expr(&mut self) -> Result<IfExpr> {
590 let start = self.curr_tok.span.start;
591
592 expect!(self, If, "'if'");
593 expect!(self, LParen, "'('");
594 let cond = self.expression(false)?;
595 expect!(self, RParen, "')'");
596 let block = self.block()?;
597 let else_block = if of_kinds!(self, Else) {
598 self.advance();
599 Some(self.block()?)
600 } else {
601 None
602 };
603
604 done!(IfExpr, start, self; cond, block, else_block)
605 }
606
607 fn for_expr(&mut self) -> Result<ForExpr> {
608 let start = self.curr_tok.span.start;
609
610 expect!(self, For, "'for'");
611 expect!(self, LParen, "'('");
612 let ident = expect_ident!(self);
613 expect!(self, In, "'in'");
614 let iter = self.expression(false)?;
615 expect!(self, RParen, "')'");
616 let block = self.block()?;
617
618 done!(ForExpr, start, self; ident, iter, block)
619 }
620
621 fn while_expr(&mut self) -> Result<WhileExpr> {
622 let start = self.curr_tok.span.start;
623
624 expect!(self, While, "'while'");
625 expect!(self, LParen, "'('");
626 let cond = self.expression(false)?;
627 expect!(self, RParen, "')'");
628 let block = self.block()?;
629
630 done!(WhileExpr, start, self; cond, block)
631 }
632
633 fn loop_expr(&mut self) -> Result<LoopExpr> {
634 let start = self.curr_tok.span.start;
635
636 expect!(self, Loop, "'loop'");
637 let block = self.block()?;
638
639 done!(LoopExpr, start, self; block)
640 }
641
642 fn fun_expr(&mut self) -> Result<FunExpr> {
643 let start = self.curr_tok.span.start;
644
645 expect!(self, Fun, "'fun'");
646 let args = self.params()?;
647 let block = self.block()?;
648
649 done!(FunExpr, start, self; args, block)
650 }
651
652 fn class_expr(&mut self) -> Result<ClassExpr> {
653 let start = self.curr_tok.span.start;
654
655 expect!(self, Class, "'class'");
656 let block = self.member_block()?;
657
658 done!(ClassExpr, start, self; block)
659 }
660
661 fn try_expr(&mut self) -> Result<TryExpr> {
662 let start = self.curr_tok.span.start;
663
664 expect!(self, Try, "'try'");
665 let try_block = self.block()?;
666 expect!(self, Catch, "'catch'");
667 expect!(self, LParen, "'('");
668 let ident = expect_ident!(self);
669 expect!(self, RParen, "')'");
670 let catch_block = self.block()?;
671
672 done!(TryExpr, start, self; try_block, ident, catch_block)
673 }
674
675 fn block_expr(&mut self) -> Result<BlockExpr> {
676 expect!(self, LBrace, "'{'");
677 let stmts = self.statements()?;
678 expect!(self, RBrace, "'}'");
679
680 Ok(stmts)
681 }
682
683 fn member_part(&mut self) -> Result<MemberPart> {
684 Ok(match self.curr_tok.kind {
685 TokenKind::Dot => {
686 self.advance();
687 MemberPart::Field(expect_ident!(self))
688 }
689 TokenKind::LBrack => {
690 self.advance();
691 let expr = self.expression(false)?;
692 expect!(self, RBrack, "']'");
693 MemberPart::Index(expr)
694 }
695 _ => error!(
696 SyntaxError,
697 self.curr_tok.span,
698 "Expected '.' or '[', found '{}'",
699 self.curr_tok.value(),
700 ),
701 })
702 }
703
704 fn call_part(&mut self) -> Result<CallPart> {
705 Ok(if of_kinds!(self, LParen) {
706 CallPart::Args(self.args()?)
707 } else {
708 CallPart::Member(self.member_part()?)
709 })
710 }
711
712 fn args(&mut self) -> Result<Args> {
713 let mut args = vec![];
714 expect!(self, LParen, "'('");
715 if !of_kinds!(self, RParen) {
716 args.push(self.expression(false)?);
717 while of_kinds!(self, Comma) {
718 self.advance();
719 if of_kinds!(self, RParen) {
720 break;
721 }
722 args.push(self.expression(false)?);
723 }
724 }
725 expect!(self, RParen, "')'");
726 Ok(args)
727 }
728
729 fn params(&mut self) -> Result<Params> {
730 let mut args = vec![];
731 expect!(self, LParen, "'('");
732 if !of_kinds!(self, RParen) {
733 args.push(expect_ident!(self));
734 while of_kinds!(self, Comma) {
735 self.advance();
736 if of_kinds!(self, RParen) {
737 break;
738 }
739 args.push(expect_ident!(self));
740 }
741 }
742 expect!(self, RParen, "')'");
743 Ok(args)
744 }
745}