1use std::rc::Rc;
2
3use crate::{
4 common::{Span, Spanned},
5 compiler::{
6 ASTNode, BinExpr, Class, Constructor, Expr, FunAccess, Ident, Op, ScriptFun, Stmt, Token,
7 TokenType, TypePath, AST,
8 },
9 error::{Error, Item},
10 Source,
11};
12
13use super::{
14 ast::{Signature, Trait, TraitMethod},
15 token::{Delimiter, Keyword, Literal, Symbol, Comment},
16 Lexer,
17};
18
19pub struct Parser {
25 tokens: Spanned<Vec<Token>>,
26 current: Token,
27 pos: usize,
28}
29
30impl Parser {
31 pub fn new(tokens: Spanned<Vec<Token>>) -> Parser {
32 Parser {
33 tokens,
34 current: (TokenType::eof(), Span::empty()),
35 pos: 0,
36 }
37 }
38
39 pub fn parse_source(source: Rc<Source>) -> Result<AST, Error> {
40 let token_stream = Lexer::new(source).tokenize()?;
41 let mut parser = Parser::new(token_stream);
42
43 Ok(parser.parse()?)
44 }
45
46 fn consume(&mut self, token_type: TokenType) -> Result<Span, Error> {
48 match token_type {
49 token_type if token_type == self.current.0 => {
50 self.pos += 1;
51 let old_token =
52 std::mem::replace(&mut self.current, self.tokens.node[self.pos].clone());
53 Ok(old_token.1)
54 }
55 _ if self.current.0 == TokenType::Delimiter(Delimiter::Newline) => {
56 self.expect_delimiter(Delimiter::Newline)?;
57 self.consume(token_type)
58 }
59 _ => Err(self.error()),
60 }
61 }
62
63 fn expect_delimiter(&mut self, delimiter: Delimiter) -> Result<Span, Error> {
65 self.consume(TokenType::Delimiter(delimiter))
66 }
67
68 fn expect_keyword(&mut self, keyword: Keyword) -> Result<Span, Error> {
70 self.consume(TokenType::Keyword(keyword))
71 }
72
73 fn symbol(&mut self, symbol: Symbol) -> Result<Span, Error> {
75 self.consume(TokenType::Symbol(symbol))
76 }
77
78 fn _expect(&mut self, token_type: TokenType) -> Result<Span, Error> {
79 match token_type {
80 token_type if token_type == self.current.0 => {
81 self.pos += 1;
82 let old_token =
83 std::mem::replace(&mut self.current, self.tokens.node[self.pos].clone());
84 Ok(old_token.1)
85 }
86 TokenType::Delimiter(Delimiter::Eof) => Err(Error::UnexpectedEOF(Item::new(
87 "<eof>",
88 self.current.1.clone(),
89 ))),
90 _ => Err(Error::ExpectedToken(
91 Item::new(&self.current.0.to_string(), self.current.1.clone()),
92 Item::new(&self.current.0.to_string(), self.current.1.clone()),
93 )),
94 }
95 }
96
97 fn last(&self) -> &Token {
98 &self.tokens.node[self.pos - 1]
99 }
100
101 fn error(&self) -> Error {
103 Error::UnexpectedToken(Item::new(
104 &self.current.0.to_string(),
105 self.current.1.clone(),
106 ))
107 }
108
109 fn next(&mut self) {
111 self.pos += 1;
112 self.current = self.tokens.node[self.pos].clone();
113 }
114
115 fn compound_statement(&mut self) -> Result<Stmt, Error> {
117 match &self.current.0 {
118 TokenType::Keyword(Keyword::If) => self.if_statement(),
119 TokenType::Keyword(Keyword::Loop) => self.loop_statement(),
120 TokenType::Keyword(Keyword::While) => self.while_statement(),
121 TokenType::Keyword(Keyword::Class) => self.class(),
122 TokenType::Keyword(Keyword::Trait) => self.parse_trait(),
123 TokenType::Keyword(Keyword::Fun) => self.fun(),
124 TokenType::Keyword(Keyword::Public) => self.modifier(),
125 TokenType::Delimiter(Delimiter::OpenBrace) => self.block(),
126 _ => self.statement(),
127 }
128 }
129
130 fn statement(&mut self) -> Result<Stmt, Error> {
132 let node = self.simple_statement();
133
134 match &self.current.0 {
135 TokenType::Delimiter(Delimiter::Newline) => {
136 self.expect_delimiter(Delimiter::Newline)?;
137 node
138 }
139 TokenType::Symbol(Symbol::SemiColon) => {
140 self.symbol(Symbol::SemiColon)?;
141 node
142 }
143 TokenType::Delimiter(Delimiter::Eof) | TokenType::Delimiter(Delimiter::CloseBrace) => {
144 node
145 }
146 node => Err(Error::ExpectedNewline(Item::new(
147 &node.to_string(),
148 self.current.1.clone(),
149 ))),
150 }
151 }
152
153 fn simple_statement(&mut self) -> Result<Stmt, Error> {
155 match &self.current.0 {
156 TokenType::Keyword(Keyword::Var) => self.var_decl(),
157 TokenType::Keyword(Keyword::Final) => self.const_decl(),
158 TokenType::Keyword(Keyword::Break) => self.break_stmt(),
159 TokenType::Keyword(Keyword::Continue) => self.continue_stmt(),
160 TokenType::Keyword(Keyword::Return) => self.return_stmt(),
161 TokenType::Keyword(Keyword::Import) => self.import_stmt(),
162 TokenType::Keyword(Keyword::Trait) => self.parse_trait(),
163 _ => Ok(self.assignment_stmt()?),
164 }
165 }
166
167 fn block(&mut self) -> Result<Stmt, Error> {
169 self.expect_delimiter(Delimiter::OpenBrace)?;
170 let mut nodes = vec![];
171 loop {
172 match &self.current.0 {
173 TokenType::Delimiter(Delimiter::CloseBrace) => {
174 self.expect_delimiter(Delimiter::CloseBrace)?;
175 break;
176 }
177 TokenType::Delimiter(Delimiter::Newline) => {
178 self.expect_delimiter(Delimiter::Newline)?;
179 continue;
180 }
181 TokenType::Delimiter(Delimiter::Eof) => {
182 return Err(Error::UnexpectedEOF(Item::new(
183 "<eof>",
184 self.current.1.clone(),
185 )));
186 }
187 TokenType::Comment(_) => {
188 self.comment()?;
189 continue;
190 }
191 _ => {
192 nodes.push(self.compound_statement()?);
193 }
194 }
195 }
196
197 Ok(Stmt::Block(Box::new(nodes), self.tokens.source.clone()))
198 }
199
200 fn loop_statement(&mut self) -> Result<Stmt, Error> {
201 self.expect_keyword(Keyword::Loop)?;
202 Ok(Stmt::LoopStatement(
203 Box::new(self.block()?),
204 self.current.1.clone(),
205 ))
206 }
207
208 fn while_statement(&mut self) -> Result<Stmt, Error> {
209 self.expect_keyword(Keyword::While)?;
210 Ok(Stmt::WhileStatement(
211 self.disjunction()?,
212 Box::new(self.block()?),
213 self.current.1.clone(),
214 ))
215 }
216
217 fn break_stmt(&mut self) -> Result<Stmt, Error> {
218 let start = self.expect_keyword(Keyword::Break)?;
219 Ok(Stmt::Break(start))
220 }
221
222 fn continue_stmt(&mut self) -> Result<Stmt, Error> {
223 let start = self.expect_keyword(Keyword::Continue)?;
224 Ok(Stmt::Continue(start))
225 }
226
227 fn if_statement(&mut self) -> Result<Stmt, Error> {
228 self.expect_keyword(Keyword::If)?;
229
230 let condition = self.disjunction()?;
231
232 let block = self.block()?;
233 let alternate = match &self.current.0 {
234 TokenType::Keyword(Keyword::Else) => Some(self.parse_else_block()?),
235 _ => None,
236 };
237
238 Ok(Stmt::IfStatement(
239 condition,
240 Box::new((block, alternate)),
241 self.current.1.clone(),
242 ))
243 }
244
245 fn parse_else_block(&mut self) -> Result<Stmt, Error> {
246 self.expect_keyword(Keyword::Else)?;
247
248 if let TokenType::Keyword(Keyword::If) = self.current.0 {
249 self.if_statement()
250 } else {
251 self.block()
252 }
253 }
254
255 fn modifier(&mut self) -> Result<Stmt, Error> {
256 self.expect_keyword(Keyword::Public)?;
257
258 match &self.current.0 {
259 TokenType::Keyword(Keyword::Fun) => {
260 let mut fun = self.fun_()?;
261 fun.0.access = FunAccess::Public;
262
263 Ok(Stmt::Function(Box::new(fun.0), fun.1))
264 }
265 _ => Err(self.error()),
266 }
267 }
268
269 fn class(&mut self) -> Result<Stmt, Error> {
270 let start = self.expect_keyword(Keyword::Class)?;
271
272 let name = self.identifier()?;
273
274 let mut fields: Vec<Stmt> = vec![];
275 let mut methods: Vec<Stmt> = vec![];
276 let mut constructors: Vec<Stmt> = vec![];
277
278 self.consume(TokenType::delimiter("{"))?;
279
280 loop {
281 match &self.current.0 {
282 TokenType::Delimiter(Delimiter::CloseBrace) => {
283 break;
284 }
285 TokenType::Keyword(keyword) => match keyword {
286 Keyword::Create => {
287 constructors.push(self.constructor(&name.name)?);
288 }
289 Keyword::Fun => {
290 methods.push(self.fun()?);
291 }
292 Keyword::Var => {
293 fields.push(self.var_decl()?);
294 }
295 _ => return Err(self.error()),
296 },
297 TokenType::Delimiter(Delimiter::Newline) => {
298 self.expect_delimiter(Delimiter::Newline)?;
299 continue;
300 }
301 TokenType::Comment(_) => {
302 self.next();
303 continue;
304 }
305 TokenType::Delimiter(Delimiter::Eof) => {
306 return Err(Error::UnexpectedEOF(Item::new(
307 "<eof>",
308 self.current.1.clone(),
309 )));
310 }
311 _ => return Err(self.error()),
312 }
313 }
314
315 let end = self.consume(TokenType::delimiter("}"))?;
316 let class = Class::new(name, None, fields, methods, constructors);
317
318 Ok(Stmt::Class(class, Span::combine(&start, &end)))
319 }
320
321 fn parse_trait(&mut self) -> Result<Stmt, Error> {
322 self.expect_keyword(Keyword::Trait)?;
323
324 let name = self.identifier()?;
325
326 match &self.current.0 {
327 TokenType::Symbol(Symbol::Colon) => self.trait_sum(name),
328 TokenType::Delimiter(Delimiter::OpenBrace) => self.trait_decl(name),
329 token => Err(Error::UnexpectedToken(Item::new(
330 &token.to_string(),
331 self.current.1.clone(),
332 ))),
333 }
334 }
335
336 fn trait_decl(&mut self, name: Ident) -> Result<Stmt, Error> {
337 self.expect_delimiter(Delimiter::OpenBrace)?;
338
339 let mut methods = Vec::new();
340
341 while self.current.0 != TokenType::Delimiter(Delimiter::CloseBrace) {
342 match &self.current.0 {
343 TokenType::Delimiter(Delimiter::Newline) => {
344 self.next();
345 continue;
346 }
347 TokenType::Keyword(Keyword::Fun) => {
348 methods.push(self.trait_method()?);
349 }
350 token => {
351 return Err(Error::UnexpectedToken(Item::new(
352 &token.to_string(),
353 self.current.1.clone(),
354 )))
355 }
356 };
357 }
358
359 let end = self.expect_delimiter(Delimiter::CloseBrace)?;
360 let span = Span::combine(&name.span, &end);
361
362 let trait_ = Trait { methods, span };
363
364 Ok(Stmt::Trait(trait_))
365 }
366
367 fn trait_method(&mut self) -> Result<TraitMethod, Error> {
368 let sig = self.fun_signature()?;
369 let start = &sig.span.clone();
370
371 let mut default = None;
372
373 if let TokenType::Delimiter(Delimiter::OpenBrace) = self.current.0 {
374 default = Some(self.block()?);
375 }
376
377 Ok(TraitMethod {
378 sig,
379 default,
380 span: Span::combine(start, &self.last().1),
381 })
382 }
383
384 fn fun_signature(&mut self) -> Result<Signature, Error> {
385 let start = self.expect_keyword(Keyword::Fun)?;
386
387 let name = self.identifier()?;
388 let params = self.params()?;
389 let return_typ = self.type_spec()?;
390
391 let end = self.current.1.clone();
392
393 Ok(Signature {
394 name,
395 params,
396 return_typ,
397 span: Span::combine(&start, &end),
398 })
399 }
400
401 fn trait_sum(&mut self, _name: Ident) -> Result<Stmt, Error> {
402 todo!()
403 }
404
405 fn constructor(&mut self, class: &str) -> Result<Stmt, Error> {
406 let start = &self.consume(TokenType::keyword("create"))?;
407 let name = self.identifier()?;
408 let params = self.params()?;
409 let body = self.block()?;
410 let end = &body.span();
411
412 let constructor = Constructor::new(name, params.0, body, class.to_string());
413
414 Ok(Stmt::Constructor(
415 Box::new(constructor),
416 Span::combine(start, end),
417 ))
418 }
419
420 fn fun(&mut self) -> Result<Stmt, Error> {
421 let fun = self.fun_()?;
422 Ok(Stmt::Function(Box::new(fun.0), fun.1))
423 }
424
425 fn fun_(&mut self) -> Result<(ScriptFun, Span), Error> {
426 let start = self.consume(TokenType::keyword("fun"))?;
427
428 let name = self.identifier()?;
429 let (params, types) = self.params()?;
430 let return_typ = self.type_spec()?;
431 let body = self.block()?;
432
433 let end = &body.span();
434
435 let access = FunAccess::Private;
436
437 let fun = ScriptFun::new(name, params, body, types, return_typ, access);
438
439 Ok((fun, Span::combine(&start, end)))
440 }
441
442 fn params(&mut self) -> Result<(Vec<Ident>, Vec<Option<Expr>>), Error> {
443 self.expect_delimiter(Delimiter::OpenParen)?;
444 let mut params = vec![];
445 let mut typs = vec![];
446
447 if TokenType::Delimiter(Delimiter::CloseParen) != self.current.0 {
448 params.push(self.identifier()?);
449 typs.push(self.type_spec()?);
450 }
451
452 loop {
453 match &self.current.0 {
454 TokenType::Symbol(Symbol::Comma) => {
455 self.consume(TokenType::symbol(","))?;
456 params.push(self.identifier()?);
457 typs.push(self.type_spec()?);
458 }
459 TokenType::Delimiter(Delimiter::CloseParen) => {
460 break;
461 }
462 _ => return Err(self.error()),
463 }
464 }
465
466 self.expect_delimiter(Delimiter::CloseParen)?;
467 Ok((params, typs))
468 }
469
470 fn return_stmt(&mut self) -> Result<Stmt, Error> {
471 let start = &self.consume(TokenType::keyword("return"))?;
472
473 let expr = if let TokenType::Delimiter(_) = self.current.0 {
474 None
475 } else {
476 Some(self.disjunction()?)
477 };
478
479 let end = if let Some(expr) = &expr {
480 expr.span()
481 } else {
482 start.clone()
483 };
484
485 let stmt = Stmt::Return(expr, Span::combine(start, &end));
486
487 Ok(stmt)
488 }
489
490 fn import_stmt(&mut self) -> Result<Stmt, Error> {
491 let start = &self.consume(TokenType::keyword("import"))?;
493
494 let import_name = self.dot_expr()?;
496
497 let end = &import_name.span();
498
499 Ok(Stmt::ImportStatement(
500 import_name,
501 Span::combine(start, end),
502 ))
503 }
504
505 fn var_decl(&mut self) -> Result<Stmt, Error> {
506 let start = &self.current.1.clone();
507
508 self.consume(TokenType::keyword("var"))?;
509 let id = self.identifier()?;
510
511 let end = &id.span();
512
513 let typ = self.type_spec()?;
514
515 let init = if let TokenType::Symbol(Symbol::Equal) = self.current.0 {
516 self.consume(TokenType::symbol("="))?;
517 Some(self.disjunction()?)
518 } else {
519 None
520 };
521
522 Ok(Stmt::VarDeclaration(
523 id,
524 init,
525 typ,
526 Span::combine(start, end),
527 ))
528 }
529
530 fn const_decl(&mut self) -> Result<Stmt, Error> {
531 let start = &self.current.1.clone();
532
533 self.consume(TokenType::keyword("con"))?;
534 let id = self.identifier()?;
535
536 let typ = self.type_spec()?;
537
538 self.consume(TokenType::symbol("="))?;
539 let init = self.disjunction()?;
540
541 let end = &init.span();
542
543 Ok(Stmt::ConDeclaration(
544 id,
545 init,
546 typ,
547 Span::combine(start, end),
548 ))
549 }
550
551 fn type_spec(&mut self) -> Result<Option<Expr>, Error> {
552 if let TokenType::Symbol(Symbol::Colon) = self.current.0 {
553 self.consume(TokenType::symbol(":"))?;
554
555 let start = self.current.1.clone();
556 let typ_path = self.type_path()?;
557
558 Ok(Some(Expr::Type(typ_path, start)))
559 } else {
560 Ok(None)
561 }
562 }
563
564 fn type_path(&mut self) -> Result<TypePath, Error> {
565 let ident = self.identifier()?;
566
567 let arguments = match &self.current.0 {
568 TokenType::Symbol(Symbol::LeftAngleBracket) => {
569 self.consume(TokenType::symbol("<"))?;
570 let argument = Some(Box::new(self.type_path()?));
571 self._expect(TokenType::symbol(">"))?;
572 argument
573 }
574 _ => None,
575 };
576
577 Ok(TypePath { ident, arguments })
578 }
579
580 fn args(&mut self) -> Result<Vec<Expr>, Error> {
581 self.expect_delimiter(Delimiter::OpenParen)?;
582
583 let mut args = vec![];
584
585 if self.current.0 != TokenType::delimiter(")") {
586 args.push(self.disjunction()?);
587 }
588
589 loop {
590 match &self.current.0 {
591 TokenType::Delimiter(Delimiter::CloseParen) => {
592 break;
593 }
594 TokenType::Symbol(Symbol::Comma) => {
595 self.consume(TokenType::symbol(","))?;
596 args.push(self.disjunction()?);
597 }
598 _ => break,
599 }
600 }
601
602 self.expect_delimiter(Delimiter::CloseParen)?;
603
604 Ok(args)
605 }
606
607 fn assignment_stmt(&mut self) -> Result<Stmt, Error> {
608 let node = self.expression()?;
609 let start = &node.span();
610
611 if let TokenType::Symbol(Symbol::Equal) = &self.current.0 {
612 self.consume(TokenType::symbol("="))?;
613
614 let id = match node {
615 Stmt::Expr(expr) => expr,
616 _ => {
617 return Err(Error::ExpectedToken(
618 Item::new("identifer", self.current.1.clone()),
619 Item::new(&self.current.0.to_string(), self.current.1.clone()),
620 ))
621 }
622 };
623
624 let val = self.disjunction()?;
625 let end = &val.span();
626
627 let node = Stmt::AssignStatement(id, val, Span::combine(start, end));
628 return Ok(node);
629 }
630
631 Ok(node)
632 }
633
634 fn expression(&mut self) -> Result<Stmt, Error> {
635 Ok(Stmt::Expr(self.disjunction()?))
636 }
637
638 fn disjunction(&mut self) -> Result<Expr, Error> {
639 let mut node = self.conjunction()?;
640 let start = &node.span();
641 while let TokenType::Keyword(Keyword::Or) = &self.current.0 {
642 self.consume(TokenType::keyword("or"))?;
643 node = Expr::Or(
644 Box::new(node),
645 Box::new(self.conjunction()?),
646 Span::combine(start, &self.current.1),
647 );
648 }
649
650 Ok(node)
651 }
652
653 fn conjunction(&mut self) -> Result<Expr, Error> {
654 let mut node = self.bitwise_or()?;
655 let start = &node.span();
656 loop {
657 if let TokenType::Keyword(Keyword::And) = &self.current.0 {
658 self.consume(TokenType::keyword("and"))?;
659 node = Expr::And(
660 Box::new(node),
661 Box::new(self.bitwise_or()?),
662 Span::combine(start, &self.current.1),
663 );
664 } else {
665 break;
666 }
667 }
668 Ok(node)
669 }
670
671 fn bitwise_or(&mut self) -> Result<Expr, Error> {
672 let mut node = self.bitwise_xor()?;
673
674 loop {
675 if let TokenType::Symbol(Symbol::Or) = &self.current.0 {
676 self.next();
677 let start = &node.span();
678
679 node = Expr::BinExpr(
680 Box::new(BinExpr::new(Op::BitwiseOr, node, self.bitwise_xor()?)),
681 Span::combine(start, &self.current.1),
682 );
683 } else {
684 break;
685 }
686 }
687
688 Ok(node)
689 }
690
691 fn bitwise_xor(&mut self) -> Result<Expr, Error> {
692 let mut node = self.bitwise_and()?;
693
694 loop {
695 if let TokenType::Symbol(Symbol::Xor) = &self.current.0 {
696 self.next();
697 let start = &node.span();
698
699 node = Expr::BinExpr(
700 Box::new(BinExpr::new(Op::BitwiseXor, node, self.bitwise_and()?)),
701 Span::combine(start, &self.current.1),
702 );
703 } else {
704 break;
705 }
706 }
707
708 Ok(node)
709 }
710
711 fn bitwise_and(&mut self) -> Result<Expr, Error> {
712 let mut node = self.comparison()?;
713
714 loop {
715 if let TokenType::Symbol(Symbol::And) = &self.current.0 {
716 self.next();
717 let start = &node.span();
718
719 node = Expr::BinExpr(
720 Box::new(BinExpr::new(Op::BitwiseAnd, node, self.comparison()?)),
721 Span::combine(start, &self.current.1),
722 );
723 } else {
724 break;
725 }
726 }
727
728 Ok(node)
729 }
730
731 fn comparison(&mut self) -> Result<Expr, Error> {
732 let mut node = self.parse_sum()?;
733 let start = &node.span();
734
735 loop {
736 match &self.current.0 {
737 TokenType::Symbol(Symbol::EqualsEquals) => {
738 self.consume(TokenType::symbol("=="))?;
739 node = Expr::BinExpr(
740 Box::new(BinExpr::new(Op::EqualTo, node, self.parse_sum()?)),
741 Span::combine(start, &self.current.1),
742 );
743 }
744 TokenType::Symbol(Symbol::NotEqual) => {
745 self.consume(TokenType::symbol("!="))?;
746 node = Expr::BinExpr(
747 Box::new(BinExpr::new(Op::NotEqual, node, self.parse_sum()?)),
748 Span::combine(start, &self.current.1),
749 );
750 }
751 TokenType::Symbol(Symbol::GreaterThanEqual) => {
752 self.consume(TokenType::symbol(">="))?;
753 node = Expr::BinExpr(
754 Box::new(BinExpr::new(Op::GreaterThanEquals, node, self.parse_sum()?)),
755 Span::combine(start, &self.current.1),
756 );
757 }
758 TokenType::Symbol(Symbol::LessThanEqual) => {
759 self.consume(TokenType::symbol("<="))?;
760 node = Expr::BinExpr(
761 Box::new(BinExpr::new(Op::LessThanEquals, node, self.parse_sum()?)),
762 Span::combine(start, &self.current.1),
763 );
764 }
765 TokenType::Symbol(Symbol::RightAngleBracket) => {
766 self.consume(TokenType::symbol(">"))?;
767 node = Expr::BinExpr(
768 Box::new(BinExpr::new(Op::GreaterThan, node, self.parse_sum()?)),
769 Span::combine(start, &self.current.1),
770 );
771 }
772 TokenType::Symbol(Symbol::LeftAngleBracket) => {
773 self.consume(TokenType::symbol("<"))?;
774 node = Expr::BinExpr(
775 Box::new(BinExpr::new(Op::LessThan, node, self.parse_sum()?)),
776 Span::combine(start, &self.current.1),
777 );
778 }
779 _ => break,
780 }
781 }
782 Ok(node)
783 }
784
785 fn _bitwise_and_or(&mut self) -> Result<Expr, Error> {
787 let node = self.parse_sum()?;
788
789 Ok(node)
790 }
791
792 fn parse_sum(&mut self) -> Result<Expr, Error> {
793 let mut node = self.parse_term()?;
794 let start = &node.span();
795 loop {
796 match &self.current.0 {
797 TokenType::Symbol(Symbol::Plus) => {
798 self.consume(TokenType::symbol("+"))?;
799 node = Expr::BinExpr(
800 Box::new(BinExpr::new(Op::Add, node, self.parse_term()?)),
801 Span::combine(start, &self.current.1),
802 );
803 }
804 TokenType::Symbol(Symbol::Hypen) => {
805 self.consume(TokenType::symbol("-"))?;
806 node = Expr::BinExpr(
807 Box::new(BinExpr::new(Op::Subtract, node, self.parse_term()?)),
808 Span::combine(start, &self.current.1),
809 );
810 }
811 _ => {
812 break;
813 }
814 }
815 }
816 Ok(node)
817 }
818
819 fn parse_term(&mut self) -> Result<Expr, Error> {
820 let mut node = self.member_expr()?;
821 let start = &node.span();
822 loop {
823 match &self.current.0 {
824 TokenType::Symbol(Symbol::Star) => {
825 self.consume(TokenType::symbol("*"))?;
826 node = Expr::BinExpr(
827 Box::new(BinExpr::new(Op::Multiply, node, self.member_expr()?)),
828 Span::combine(start, &self.current.1),
829 );
830 }
831 TokenType::Symbol(Symbol::Slash) => {
832 self.consume(TokenType::symbol("/"))?;
833 node = Expr::BinExpr(
834 Box::new(BinExpr::new(Op::Divide, node, self.member_expr()?)),
835 Span::combine(start, &self.current.1),
836 );
837 }
838 TokenType::Symbol(Symbol::Modulo) => {
839 self.consume(TokenType::symbol("%"))?;
840 node = Expr::BinExpr(
841 Box::new(BinExpr::new(Op::Remainder, node, self.member_expr()?)),
842 Span::combine(start, &self.current.1),
843 );
844 }
845 _ => {
846 break;
847 }
848 }
849 }
850 Ok(node)
851 }
852
853 fn member_expr(&mut self) -> Result<Expr, Error> {
854 let mut node = self.dot_expr()?;
855 let start = node.span();
856
857 loop {
858 match self.current.0.clone() {
859 TokenType::Delimiter(Delimiter::OpenBracket) => {
860 self.expect_delimiter(Delimiter::OpenBracket)?;
861 node = Expr::Index(
862 Box::new(node),
863 Box::new(self.disjunction()?),
864 Span::combine(&start, &self.current.1.clone()),
865 );
866 self.expect_delimiter(Delimiter::CloseBracket)?;
867 }
868 TokenType::Delimiter(Delimiter::OpenParen) => {
869 node = Expr::FunCall(
870 Box::new(node),
871 Box::new(self.args()?),
872 Span::combine(&start, &self.current.1.clone()),
873 );
874 }
875 TokenType::Comment(typ) => {
876 self.consume(TokenType::Comment(typ))?;
877 continue;
878 }
879 _ => break,
880 }
881 }
882
883 Ok(node)
884 }
885
886 fn dot_expr(&mut self) -> Result<Expr, Error> {
887 let mut node = self.paren_expr()?;
888 let start = node.span();
889
890 loop {
891 match &self.current.0 {
892 TokenType::Symbol(Symbol::Dot) => {
893 self.consume(TokenType::symbol("."))?;
894
895 node = Expr::MemberExpr(
896 Box::new(node),
897 Box::new(self.paren_expr()?),
898 Span::combine(&start, &self.current.1.clone()),
899 );
900 }
901 TokenType::Symbol(Symbol::Colon) => {
902 self.consume(TokenType::symbol(":"))?;
903
904 node = Expr::AssocExpr(
905 Box::new(node),
906 Box::new(self.paren_expr()?),
907 Span::combine(&start, &self.current.1),
908 );
909 }
910 TokenType::Comment(_) => {
911 self.comment()?;
912 continue;
913 }
914 _ => break,
915 }
916 }
917
918 Ok(node)
919 }
920
921 fn paren_expr(&mut self) -> Result<Expr, Error> {
922 if let TokenType::Delimiter(Delimiter::OpenParen) = self.current.0 {
923 let start = &self.expect_delimiter(Delimiter::OpenParen)?;
924 let node = self.disjunction()?;
925
926 if let TokenType::Symbol(Symbol::Comma) = self.current.0 {
927 todo!()
928 }
929
930 let end = &self.expect_delimiter(Delimiter::CloseParen)?;
931 return Ok(Expr::ParenExpr(Box::new(node), Span::combine(start, end)));
932 }
933
934 self.factor()
935 }
936
937 fn factor(&mut self) -> Result<Expr, Error> {
938 let node;
939 match &self.current.0 {
940 TokenType::Literal(literal) => match literal {
941 Literal::NumberLiteral(number) => {
942 node = Expr::Number(number.parse::<f64>().unwrap(), self.current.1.clone());
943 self.next();
944 }
945 Literal::StringLiteral(string) => {
946 node = Expr::String(string.to_owned(), self.current.1.clone());
947 self.next();
948 }
949 Literal::CharLiteral(_) => {
950 unimplemented!()
951 }
952 Literal::False => {
953 node = Expr::Boolean(false, self.current.1.clone());
954 self.next();
955 }
956 Literal::True => {
957 node = Expr::Boolean(true, self.current.1.clone());
958 self.next();
959 }
960 Literal::Nil => {
961 node = Expr::Nil(self.current.1.clone());
962 self.next();
963 }
964 Literal::Id(_) => {
965 node = Expr::Identifier(self.identifier()?);
966 }
967 },
968 TokenType::Symbol(sym) => match sym {
969 Symbol::Plus => {
970 self.consume(TokenType::symbol("+"))?;
971 node = Expr::UnaryExpr(
972 Op::Add,
973 Box::new(self.paren_expr()?),
974 self.current.1.clone(),
975 );
976 }
977 Symbol::Hypen => {
978 self.consume(TokenType::symbol("-"))?;
979 node = Expr::UnaryExpr(
980 Op::Subtract,
981 Box::new(self.paren_expr()?),
982 self.current.1.clone(),
983 );
984 }
985 Symbol::Bang => {
986 self.consume(TokenType::symbol("!"))?;
987 node = Expr::UnaryExpr(
988 Op::Bang,
989 Box::new(self.paren_expr()?),
990 self.current.1.clone(),
991 );
992 }
993 sym => {
994 return Err(Error::UnexpectedToken(Item::new(
995 &sym.to_string(),
996 self.current.1.clone(),
997 )))
998 }
999 },
1000 TokenType::Delimiter(delimiter) => match delimiter {
1001 Delimiter::OpenParen => node = self.tuple()?,
1002 Delimiter::OpenBracket => node = self.list()?,
1003 Delimiter::OpenBrace => node = self.map()?,
1004 Delimiter::Newline => {
1005 self.next();
1006 node = self.factor()?;
1007 }
1008 sym => {
1009 return Err(Error::UnexpectedToken(Item::new(
1010 &sym.to_string(),
1011 self.current.1.clone(),
1012 )))
1013 }
1014 },
1015 TokenType::Keyword(Keyword::Self_) => {
1016 node = Expr::SelfExpr(self.current.1.clone());
1017 self.next();
1018 }
1019 TokenType::Comment(Comment::BlockComment) => {
1020 self.next();
1021
1022 node = self.factor()?;
1023 }
1024 _ => {
1025 return Err(Error::UnexpectedToken(Item::new(
1026 &self.current.0.to_string(),
1027 self.current.1.clone(),
1028 )))
1029 }
1030 }
1031 Ok(node)
1032 }
1033
1034 fn list(&mut self) -> Result<Expr, Error> {
1035 self.expect_delimiter(Delimiter::OpenBracket)?;
1036
1037 let mut nodes = vec![];
1038
1039 loop {
1040 match &self.current.0 {
1041 TokenType::Symbol(Symbol::Comma) => {
1042 self.next();
1043 }
1044 TokenType::Delimiter(Delimiter::CloseBracket) => {
1045 break;
1046 }
1047 _ => nodes.push(self.disjunction()?),
1048 }
1049 }
1050
1051 self.expect_delimiter(Delimiter::CloseBracket)?;
1052
1053 Ok(Expr::List(Box::new(nodes), self.current.1.clone()))
1054 }
1055
1056 fn tuple(&mut self) -> Result<Expr, Error> {
1057 let start = self.expect_delimiter(Delimiter::OpenParen)?;
1058
1059 let mut tuple = Vec::new();
1060 let node = self.disjunction()?;
1061
1062 if let TokenType::Delimiter(Delimiter::CloseParen) = self.current.0 {
1063 self.expect_delimiter(Delimiter::CloseParen)?;
1064 return Ok(node);
1065 }
1066
1067 tuple.push(node);
1068
1069 while let TokenType::Symbol(Symbol::Comma) = &self.current.0 {
1070 self.consume(TokenType::symbol(","))?;
1071 tuple.push(self.disjunction()?);
1072 }
1073
1074 let end = &self.expect_delimiter(Delimiter::CloseParen)?;
1075
1076 Ok(Expr::Tuple(Box::new(tuple), Span::combine(&start, end)))
1077 }
1078
1079 fn map(&mut self) -> Result<Expr, Error> {
1080 let start = &self.expect_delimiter(Delimiter::OpenBrace)?;
1081
1082 if let TokenType::Delimiter(Delimiter::CloseBrace) = self.current.0 {
1083 let end = &self.expect_delimiter(Delimiter::CloseBrace)?;
1084
1085 return Ok(Expr::Map(Box::new(vec![]), Span::combine(start, end)));
1086 }
1087
1088 let mut map = vec![];
1089 loop {
1090 let key = self.factor()?;
1091 self.consume(TokenType::symbol(":"))?;
1092 let value = self.disjunction()?;
1093
1094 map.push((key, value));
1095
1096 match &self.current.0 {
1097 TokenType::Delimiter(Delimiter::CloseBrace) => break,
1098 _ => {
1099 self.consume(TokenType::symbol(","))?;
1100 continue;
1101 }
1102 }
1103 }
1104
1105 let end = &self.expect_delimiter(Delimiter::CloseBrace)?;
1106
1107 Ok(Expr::Map(Box::new(map), Span::combine(start, end)))
1108 }
1109
1110 fn identifier(&mut self) -> Result<Ident, Error> {
1112 let name = self.current.0.to_string();
1113 let span = self.current.1.clone();
1114 self.consume(TokenType::Literal(Literal::Id(name.clone())))?;
1115 Ok(Ident { name, span })
1116 }
1117
1118 fn comment(&mut self) -> Result<(), Error> {
1119 self.next();
1120
1121 Ok(())
1122 }
1123
1124 pub fn parse_file(&mut self) -> Result<AST, Error> {
1125 let mut nodes = vec![];
1126
1127 loop {
1128 match &self.current.0 {
1129 TokenType::Delimiter(Delimiter::Eof) => break,
1130 TokenType::Delimiter(Delimiter::Newline) => {
1131 self.expect_delimiter(Delimiter::Newline)?;
1132 continue;
1133 }
1134 TokenType::Comment(_) => {
1135 self.comment()?;
1136 continue;
1137 }
1138 _ => nodes.push(ASTNode::from(self.compound_statement()?)),
1139 }
1140 }
1141
1142 Ok(AST::new(nodes, self.tokens.source.clone()))
1143 }
1144
1145 pub fn parse(&mut self) -> Result<AST, Error> {
1146 self.current = self.tokens.node[self.pos].clone();
1147
1148 let ast = self.parse_file()?;
1149
1150 Ok(ast)
1151 }
1152}