roost_lang/
parser.rs

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    // ---------------------------------------
176
177    #[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}