1use symboscript_lexer::Lexer;
2use symboscript_types::{
3 lexer::{Token, TokenKind, TokenValue},
4 parser::*,
5};
6use symboscript_utils::report_error;
7
8#[macro_use]
9mod macro_utils;
10
11pub struct Parser<'a> {
12 path: &'a str,
14
15 source: &'a str,
17
18 lexer: Lexer<'a>,
20
21 cur_token: Token,
22
23 prev_token_end: usize,
24}
25
26impl<'a> Parser<'a> {
27 pub fn new(path: &'a str, source: &'a str) -> Self {
28 Self {
29 path,
30 source,
31 lexer: Lexer::new(path, source, false),
32 cur_token: Token::default(),
33 prev_token_end: 0,
34 }
35 }
36
37 pub fn parse(&mut self) -> Ast {
38 self.eat(TokenKind::Start);
39 return Ast {
40 program: self.program(),
41 };
42 }
43
44 fn program(&mut self) -> Program {
47 Program {
48 node: Node {
49 start: 0,
50 end: self.source.len(),
51 },
52 body: self.body(),
53 }
54 }
55
56 fn body(&mut self) -> Vec<Statement> {
57 let mut body = vec![];
58
59 loop {
60 match self.cur_kind() {
61 TokenKind::Eof | TokenKind::RAngle => break,
62 _ => {
63 body.push(self.statement());
64 }
65 }
66 }
67
68 body
69 }
70
71 fn statement(&mut self) -> Statement {
74 match self.cur_kind() {
75 TokenKind::Let => self.var_decl(false),
76 TokenKind::Function | TokenKind::Async => self.fn_decl(),
77 TokenKind::Scope => self.scope_decl(),
78 TokenKind::Context => self.context_decl(),
79
80 TokenKind::If => self.if_stmt(),
81
82 TokenKind::For => self.for_stmt(),
83 TokenKind::While => self.while_stmt(),
84 TokenKind::Loop => self.loop_stmt(),
85
86 TokenKind::Continue => self.continue_stmt(),
87 TokenKind::Break => self.break_stmt(),
88
89 TokenKind::Throw => self.throw_stmt(),
90
91 TokenKind::Return => self.return_stmt(),
92 TokenKind::Yield => self.yield_stmt(),
93
94 TokenKind::Import => self.import_statement(),
95
96 TokenKind::Block => self.block_decl(),
97 TokenKind::LAngle => Statement::BlockStatement(self.block_stmt()),
98
99 TokenKind::Mut => self.assign_statement(),
100
101 _ => self.expr_stmt(),
102 }
103 }
104
105 fn block_stmt(&mut self) -> Vec<Statement> {
106 let mut body = vec![];
107
108 if self.cur_kind() == TokenKind::LAngle {
109 body = {
110 let start = self.cur_token.start;
111 self.eat(TokenKind::LAngle);
112 let consequent = self.body();
113 self.eat_with_start(TokenKind::RAngle, start);
114 consequent
115 }
116 } else {
117 body.push(self.statement());
118 }
119
120 return body;
121 }
122
123 fn import_statement(&mut self) -> Statement {
126 let start = self.cur_token.start;
127 self.advance();
128
129 let source = Identifier {
130 node: Node::new(self.cur_token.start, self.cur_token.end),
131 name: match self.cur_token.value.clone() {
132 TokenValue::Str(s) => s,
133 TokenValue::Identifier(s) => s,
134 got => {
135 self.report_expected(self.cur_token.start, "Identifier or String", got);
136 unreachable!("Report ends proccess");
137 }
138 },
139 };
140
141 self.advance();
142
143 let as_name = match self.cur_kind() {
144 TokenKind::As => {
145 self.advance();
146
147 let id = Identifier {
148 node: Node::new(self.cur_token.start, self.cur_token.end),
149 name: format!("{}", self.cur_token.clone().value),
150 };
151
152 self.eat(TokenKind::Identifier);
153
154 id
155 }
156
157 _ => source.clone(),
158 };
159
160 self.eat(TokenKind::Semicolon);
161
162 Statement::ImportStatement(uni_builder!(
163 self,
164 ImportStatement,
165 start,
166 [source, as_name]
167 ))
168 }
169
170 fn scope_decl(&mut self) -> Statement {
173 let start = self.cur_token.start;
174 self.eat(TokenKind::Scope);
175
176 let id = format!("{}", self.cur_token.clone().value);
177 self.eat(TokenKind::Identifier);
178
179 let body = self.block_stmt();
180
181 Statement::ScopeDeclaration(uni_builder!(self, ScopeDeclarator, start, [id, body]))
182 }
183
184 fn context_decl(&mut self) -> Statement {
185 let start = self.cur_token.start;
186 self.eat(TokenKind::Context);
187
188 let id = format!("{}", self.cur_token.clone().value);
189 self.eat(TokenKind::Identifier);
190
191 let body = self.block_stmt();
192
193 Statement::ContextDeclaration(uni_builder!(self, ContextDeclarator, start, [id, body]))
194 }
195
196 fn loop_stmt(&mut self) -> Statement {
199 let start = self.cur_token.start;
200 self.eat(TokenKind::Loop);
201 let body = self.block_stmt();
202
203 Statement::LoopStatement(uni_builder!(self, LoopStatement, start, [body]))
204 }
205
206 fn while_stmt(&mut self) -> Statement {
209 let start = self.cur_token.start;
210 self.eat(TokenKind::While);
211
212 let test = {
213 let start = self.cur_token.start;
214 self.eat(TokenKind::LParen);
215 let test = self.expr();
216 self.eat_with_start(TokenKind::RParen, start);
217 test
218 };
219
220 let body = self.block_stmt();
221
222 Statement::WhileStatement(uni_builder!(self, WhileStatement, start, [test, body]))
223 }
224
225 fn for_stmt(&mut self) -> Statement {
228 let start = self.cur_token.start;
229
230 self.eat(TokenKind::For);
231 self.eat(TokenKind::LParen);
232
233 let init = self.var_decl(true);
234
235 let test = {
236 let start = self.cur_token.start;
237 let test = self.expr();
238 self.eat_with_start(TokenKind::Semicolon, start);
239 test
240 };
241
242 let update = {
243 let start = self.cur_token.start;
244 let update = self.expr();
245 self.eat_with_start(TokenKind::RParen, start);
246 update
247 };
248
249 let body = self.block_stmt();
250
251 Statement::ForStatement(Box::new(uni_builder!(
252 self,
253 ForStatement,
254 start,
255 [init, test, update, body]
256 )))
257 }
258
259 fn if_stmt(&mut self) -> Statement {
262 let start = self.cur_token.start;
263
264 self.eat(TokenKind::If);
265
266 let test = {
267 let start = self.cur_token.start;
268 self.eat(TokenKind::LParen);
269 let test = self.expr();
270 self.eat_with_start(TokenKind::RParen, start);
271 test
272 };
273
274 let consequent = self.block_stmt();
275
276 let mut alternate = vec![];
277
278 if self.cur_kind() == TokenKind::Else {
279 self.advance();
280 alternate = self.block_stmt();
281 }
282
283 Statement::IfStatement(uni_builder!(
284 self,
285 IfStatement,
286 start,
287 [test, consequent, alternate]
288 ))
289 }
290
291 fn return_stmt(&mut self) -> Statement {
294 word_stmt!(self, TokenKind::Return, ReturnStatement)
295 }
296
297 fn yield_stmt(&mut self) -> Statement {
298 word_stmt!(self, TokenKind::Yield, YieldStatement)
299 }
300
301 fn throw_stmt(&mut self) -> Statement {
302 word_stmt!(self, TokenKind::Throw, ThrowStatement)
303 }
304
305 fn block_decl(&mut self) -> Statement {
306 self.advance();
307
308 Statement::BlockStatement(self.block_stmt())
309 }
310
311 fn continue_stmt(&mut self) -> Statement {
312 let start = self.cur_token.start;
313 self.eat(TokenKind::Continue);
314
315 Statement::ContinueStatement(Node::new(start, self.cur_token.end))
316 }
317
318 fn break_stmt(&mut self) -> Statement {
319 let start = self.cur_token.start;
320 self.eat(TokenKind::Break);
321
322 Statement::BreakStatement(Node::new(start, self.cur_token.end))
323 }
324
325 fn fn_decl(&mut self) -> Statement {
328 let start = self.cur_token.start;
329
330 let is_async = {
331 if self.cur_kind() == TokenKind::Async {
332 self.eat(TokenKind::Async);
333 true
334 } else {
335 false
336 }
337 };
338
339 self.advance();
340
341 let id = format!("{}", self.cur_token.clone().value);
342 self.eat(TokenKind::Identifier);
343
344 let params = {
345 let start = self.cur_token.start;
346
347 self.eat(TokenKind::LSquare);
348
349 let params = self
350 .parse_params()
351 .into_iter()
352 .map(|p| format!("{}", p.value))
353 .collect();
354
355 self.eat_with_start(TokenKind::RSquare, start);
356 params
357 };
358
359 let body = self.block_stmt();
360
361 Statement::FunctionDeclaration(uni_builder!(
362 self,
363 FunctionDeclarator,
364 start,
365 [id, params, body, is_async]
366 ))
367 }
368
369 fn parse_params(&mut self) -> Vec<Token> {
370 let mut params = vec![];
371
372 if self.cur_kind() == TokenKind::RSquare {
373 return params;
375 }
376
377 params.push(self.cur_token.clone());
378 self.eat(TokenKind::Identifier);
379
380 while self.cur_kind() == TokenKind::Comma {
381 self.advance();
382 params.push(self.cur_token.clone());
383 self.eat(TokenKind::Identifier);
384 }
385
386 params
387 }
388
389 fn var_decl(&mut self, only_with_init: bool) -> Statement {
392 let start = self.cur_token.start;
393 self.advance();
394
395 let id = format!("{}", self.cur_token.clone().value);
396 self.eat(TokenKind::Identifier);
397
398 let mut is_formula = false;
399
400 let init = {
401 let start = self.cur_token.start;
402
403 match self.cur_kind() {
404 TokenKind::Assign => {
405 self.advance();
406 self.expr()
407 }
408 TokenKind::FormulaAssign => {
409 is_formula = true;
410 self.advance();
411 self.expr()
412 }
413 _ if !only_with_init => Expression::None(None {
414 node: Node::new(start, self.cur_token.end),
415 }),
416 _ => {
417 self.report_expected(start, "Assign or FormulaAssign", self.cur_kind());
418 unreachable!("Report ends proccess");
419 }
420 }
421 };
422
423 self.eat(TokenKind::Semicolon);
424
425 Statement::VariableDeclaration(uni_builder!(
426 self,
427 VariableDeclarator,
428 start,
429 [id, init, is_formula]
430 ))
431 }
432
433 fn assign_statement(&mut self) -> Statement {
437 let start = self.cur_token.start;
438
439 self.eat(TokenKind::Mut);
440
441 let left = self.cur_token.clone();
442 self.eat(TokenKind::Identifier);
443
444 let left = Identifier {
445 node: Node::new(start, self.cur_token.end),
446 name: format!("{}", left.value),
447 };
448
449 if [
450 TokenKind::Assign,
451 TokenKind::PlusAssign,
452 TokenKind::MinusAssign,
453 TokenKind::MultiplyAssign,
454 TokenKind::DivideAssign,
455 TokenKind::PowerAssign,
456 TokenKind::ModuloAssign,
457 ]
458 .contains(&self.cur_token.kind)
459 {
460 let current_token = self.cur_token.clone();
461
462 self.advance();
463
464 let right = self.expr();
465 let operator = self.kind_to_assign_op(current_token.kind);
466
467 self.eat(TokenKind::Semicolon);
468 Statement::AssignStatement(uni_builder!(
469 self,
470 AssignStatement,
471 start,
472 [left, right, operator]
473 ))
474 } else {
475 self.report_expected(start, "= | += | -= | *= | /= | ^= | %=", self.cur_kind());
476 unreachable!("Report ends proccess");
477 }
478 }
479
480 fn expr_stmt(&mut self) -> Statement {
483 let expression = self.expr();
484 self.eat(TokenKind::Semicolon);
485
486 Statement::ExpressionStatement(expression)
487 }
488
489 fn expr(&mut self) -> Expression {
491 self.comma(false)
492 }
493
494 fn comma(&mut self, only_sequence: bool) -> Expression {
496 let start = self.cur_token.start;
497 let mut nodes = vec![];
498
499 nodes.push(self.ternary());
500 while self.cur_kind() == TokenKind::Comma {
501 self.advance();
502 nodes.push(self.ternary());
503 }
504
505 if !only_sequence && nodes.len() == 1 {
506 return nodes[0].clone();
507 }
508
509 self.sequence_expression(start, nodes)
510 }
511
512 fn ternary(&mut self) -> Expression {
514 let start = self.cur_token.start;
515 let mut node = self.range();
516
517 while self.cur_kind() == TokenKind::Question {
518 self.advance();
519 let consequent = self.range();
520 self.eat(TokenKind::Colon);
521
522 let alternate = self.expr();
523
524 node = self.conditional_expression(start, node, consequent, alternate);
525 }
526
527 node
528 }
529
530 fn range(&mut self) -> Expression {
532 binary_left_associative!(self, [TokenKind::Range], logical_or)
533 }
534
535 fn logical_or(&mut self) -> Expression {
537 binary_left_associative!(self, [TokenKind::PipePipe], logical_and)
538 }
539
540 fn logical_and(&mut self) -> Expression {
542 binary_left_associative!(self, [TokenKind::AmpersandAmpersand], cmp)
543 }
544
545 fn cmp(&mut self) -> Expression {
547 binary_left_associative!(
548 self,
549 [
550 TokenKind::Less,
551 TokenKind::LessEqual,
552 TokenKind::Greater,
553 TokenKind::GreaterEqual,
554 TokenKind::Equal,
555 TokenKind::NotEqual,
556 ],
557 bit_or
558 )
559 }
560
561 fn bit_or(&mut self) -> Expression {
563 binary_left_associative!(self, [TokenKind::Pipe], bit_xor)
564 }
565
566 fn bit_xor(&mut self) -> Expression {
568 binary_left_associative!(self, [TokenKind::BitXor], bit_and)
569 }
570
571 fn bit_and(&mut self) -> Expression {
573 binary_left_associative!(self, [TokenKind::Ampersand], shift)
574 }
575
576 fn shift(&mut self) -> Expression {
578 binary_left_associative!(
579 self,
580 [TokenKind::BitRightShift, TokenKind::BitLeftShift],
581 add_sub
582 )
583 }
584
585 fn add_sub(&mut self) -> Expression {
587 binary_left_associative!(self, [TokenKind::Plus, TokenKind::Minus], term)
588 }
589
590 fn term(&mut self) -> Expression {
592 let start = self.cur_token.start;
593 let mut expr = self.power();
594
595 while [TokenKind::Identifier, TokenKind::LParen, TokenKind::Number]
596 .contains(&self.cur_kind())
597 {
598 let right = self.power();
599 expr = self.binary_expression(start, expr, right, TokenKind::Star);
600 }
601
602 while [TokenKind::Star, TokenKind::Slash, TokenKind::Modulo].contains(&self.cur_kind()) {
603 let operator = self.cur_kind();
604 self.advance();
605
606 let right = self.power();
607
608 expr = self.binary_expression(start, expr, right, operator);
609 }
610
611 expr
612 }
613
614 fn power(&mut self) -> Expression {
616 binary_left_associative!(self, [TokenKind::Caret], factor)
617 }
618
619 fn factor(&mut self) -> Expression {
621 let token = self.cur_token.clone();
622
623 match token.kind {
624 TokenKind::Number | TokenKind::Str => {
625 self.advance();
626 return Expression::Literal(Literal {
627 node: Node::new(token.start, token.end),
628 value: token.value,
629 });
630 }
631
632 TokenKind::True => {
633 self.advance();
634 return Expression::Literal(Literal {
635 node: Node::new(token.start, token.end),
636 value: TokenValue::Bool(true),
637 });
638 }
639
640 TokenKind::False => {
641 self.advance();
642 return Expression::Literal(Literal {
643 node: Node::new(token.start, token.end),
644 value: TokenValue::Bool(false),
645 });
646 }
647
648 TokenKind::LParen => {
649 self.advance();
650 let node = self.expr();
651 self.eat_with_start(TokenKind::RParen, token.start);
652 return node;
653 }
654
655 TokenKind::LSquare => self.read_seq_expr(token),
656
657 TokenKind::ExclamationMark
658 | TokenKind::PlusPlus
659 | TokenKind::MinusMinus
660 | TokenKind::Tilde
661 | TokenKind::Minus
662 | TokenKind::Plus => {
663 self.advance();
664
665 let right = self.factor();
666 return self.unary_expression(token.start, token.kind, right);
667 }
668 _ => return self.await_expr(),
669 }
670 }
671
672 fn read_seq_expr(&mut self, token: Token) -> Expression {
673 self.advance();
674
675 match self.cur_kind() {
676 TokenKind::RSquare => {
677 self.advance();
678 return self.sequence_expression(token.start, vec![]);
679 }
680 _ => {}
681 }
682
683 let mut node = self.comma(true);
684 self.eat_with_start(TokenKind::RSquare, token.start);
685
686 match node {
687 Expression::SequenceExpression(seq_exp) => {
688 node = self.sequence_expression(token.start, seq_exp.expressions);
689 }
690 _ => node = self.sequence_expression(token.start, vec![node]),
691 }
692
693 return node;
694 }
695
696 fn await_expr(&mut self) -> Expression {
698 word_right_associative_expr!(self, TokenKind::Await, delete_expr, await_expr)
699 }
700
701 fn delete_expr(&mut self) -> Expression {
703 word_right_associative_expr!(self, TokenKind::Delete, dot, delete_expr)
704 }
705
706 fn dot(&mut self) -> Expression {
708 member_left_associative!(self, [TokenKind::Dot], call)
709 }
710
711 fn call(&mut self) -> (Expression, bool) {
713 let token = self.cur_token.clone();
714
715 match self.cur_kind() {
716 TokenKind::Identifier => {
717 self.advance();
718
719 match self.cur_kind() {
720 TokenKind::LSquare => {
721 let sequence_start = self.cur_token.start;
722
723 self.advance();
724
725 match self.cur_kind() {
726 TokenKind::RSquare => {
727 self.advance();
728
729 let node = self.sequence_expression(sequence_start, vec![]);
730
731 return (
732 self.call_expression(
733 sequence_start,
734 format!("{}", token.value),
735 node,
736 ),
737 false,
738 );
739 }
740 _ => {}
741 }
742
743 let mut node = self.expr();
744 self.eat_with_start(TokenKind::RSquare, token.start);
745
746 match node {
747 Expression::SequenceExpression(seq_exp) => {
748 node =
749 self.sequence_expression(sequence_start, seq_exp.expressions);
750 }
751 _ => node = self.sequence_expression(sequence_start, vec![node]),
752 }
753
754 return (
755 self.call_expression(token.start, format!("{}", token.value), node),
756 false,
757 );
758 }
759 _ => {
760 return (
761 Expression::Identifier(Identifier {
762 node: Node::new(token.start, token.end),
763 name: format!("{}", token.value),
764 }),
765 false,
766 );
767 }
768 }
769 }
770 TokenKind::LSquare => {
771 self.advance();
772
773 let node = self.expr();
774 self.eat_with_start(TokenKind::RSquare, token.start);
775
776 return (node, true);
777 }
778 got => {
779 self.report_expected(token.start, "Identifier or [", got);
780 unreachable!("Report ends proccess");
781 }
782 }
783 }
784
785 fn call_expression(
788 &mut self,
789 start: usize,
790 callee: String,
791 arguments: Expression,
792 ) -> Expression {
793 Expression::CallExpression(Box::new(CallExpression {
794 node: Node::new(start, self.cur_token.end),
795 callee,
796 arguments,
797 }))
798 }
799
800 fn member_expression(
801 &mut self,
802 start: usize,
803 object: Expression,
804 property: Expression,
805 is_expr: bool,
806 ) -> Expression {
807 Expression::MemberExpression(Box::new(MemberExpression {
808 node: Node::new(start, self.cur_token.end),
809 object,
810 property,
811 is_expr,
812 }))
813 }
814
815 fn sequence_expression(&mut self, start: usize, expressions: Vec<Expression>) -> Expression {
816 Expression::SequenceExpression(Box::new(SequenceExpression {
817 node: Node::new(start, self.cur_token.end),
818 expressions,
819 }))
820 }
821
822 fn conditional_expression(
823 &mut self,
824 start: usize,
825 test: Expression,
826 consequent: Expression,
827 alternate: Expression,
828 ) -> Expression {
829 Expression::ConditionalExpression(Box::new(ConditionalExpression {
830 node: Node::new(start, self.cur_token.end),
831 test,
832 consequent,
833 alternate,
834 }))
835 }
836
837 fn binary_expression(
838 &mut self,
839 start: usize,
840 left: Expression,
841 right: Expression,
842 operator: TokenKind,
843 ) -> Expression {
844 Expression::BinaryExpression(Box::new(BinaryExpression {
845 node: Node::new(start, self.cur_token.end),
846 left,
847 operator: self.kind_to_bin_op(operator),
848 right,
849 }))
850 }
851
852 fn unary_expression(
853 &mut self,
854 start: usize,
855 operator: TokenKind,
856 right: Expression,
857 ) -> Expression {
858 Expression::UnaryExpression(Box::new(UnaryExpression {
859 node: Node::new(start, self.cur_token.end),
860 operator: self.kind_to_un_op(operator),
861 right,
862 }))
863 }
864
865 fn kind_to_word_op(&mut self, kind: TokenKind) -> WordOperator {
868 match kind {
869 TokenKind::Await => WordOperator::Await,
870 TokenKind::Delete => WordOperator::Delete,
871
872 got => unreachable!("This function can't be called for other tokens: ({})", got),
873 }
874 }
875
876 fn kind_to_un_op(&mut self, kind: TokenKind) -> UnaryOperator {
877 match kind {
878 TokenKind::MinusMinus => UnaryOperator::MinusMinus,
879 TokenKind::Tilde => UnaryOperator::BitNot,
880 TokenKind::ExclamationMark => UnaryOperator::Not,
881 TokenKind::PlusPlus => UnaryOperator::PlusPlus,
882
883 TokenKind::Plus => UnaryOperator::Plus,
884 TokenKind::Minus => UnaryOperator::Minus,
885
886 got => unreachable!("This function can't be called for other tokens: ({})", got),
887 }
888 }
889
890 fn kind_to_assign_op(&mut self, kind: TokenKind) -> AssignOperator {
891 match kind {
892 TokenKind::Assign => AssignOperator::Assign,
893 TokenKind::PlusAssign => AssignOperator::PlusAssign,
894 TokenKind::MinusAssign => AssignOperator::MinusAssign,
895 TokenKind::MultiplyAssign => AssignOperator::MultiplyAssign,
896 TokenKind::DivideAssign => AssignOperator::DivideAssign,
897 TokenKind::PowerAssign => AssignOperator::PowerAssign,
898 TokenKind::ModuloAssign => AssignOperator::ModuloAssign,
899
900 got => unreachable!("This function can't be called for other tokens: ({})", got),
901 }
902 }
903
904 fn kind_to_bin_op(&mut self, kind: TokenKind) -> BinaryOperator {
905 match kind {
906 TokenKind::Plus => BinaryOperator::Add,
907 TokenKind::Minus => BinaryOperator::Substract,
908 TokenKind::Star => BinaryOperator::Multiply,
909 TokenKind::Slash => BinaryOperator::Divide,
910 TokenKind::Caret => BinaryOperator::Power,
911 TokenKind::Range => BinaryOperator::Range,
912 TokenKind::Modulo => BinaryOperator::Modulo,
913
914 TokenKind::AmpersandAmpersand => BinaryOperator::And,
915 TokenKind::PipePipe => BinaryOperator::Or,
916 TokenKind::Xor => BinaryOperator::Xor,
917
918 TokenKind::Ampersand => BinaryOperator::BitAnd,
919 TokenKind::Pipe => BinaryOperator::BitOr,
920 TokenKind::BitXor => BinaryOperator::BitXor,
921
922 TokenKind::BitLeftShift => BinaryOperator::BitLeftShift,
923 TokenKind::BitRightShift => BinaryOperator::BitRightShift,
924
925 TokenKind::Equal => BinaryOperator::Equal,
926 TokenKind::NotEqual => BinaryOperator::NotEqual,
927 TokenKind::Less => BinaryOperator::Less,
928 TokenKind::LessEqual => BinaryOperator::LessEqual,
929 TokenKind::Greater => BinaryOperator::Greater,
930 TokenKind::GreaterEqual => BinaryOperator::GreaterEqual,
931 _ => unreachable!("This function can't be called for other tokens: ({kind})"),
932 }
933 }
934
935 fn eat(&mut self, kind: TokenKind) {
936 self.eat_with_start(kind, self.cur_token.start);
937 }
938
939 fn eat_with_start(&mut self, kind: TokenKind, start: usize) -> bool {
940 if self.at(kind) {
941 self.advance();
942 return true;
943 }
944
945 let val = self.cur_token.value.to_string();
946
947 self.report_expected(
948 start,
949 kind,
950 format!(
951 "{} {}",
952 self.cur_kind(),
953 if self.cur_token.value == TokenValue::None {
954 ""
955 } else {
956 &val
957 }
958 ),
959 );
960 unreachable!("Report ends proccess");
961 }
962
963 fn report_expected<T: std::fmt::Display, U: std::fmt::Display>(
964 &self,
965 start: usize,
966 expected: T,
967 got: U,
968 ) {
969 report_error(
970 self.path,
971 self.source,
972 &format!("Expected {expected} but got {got}"),
973 start,
974 self.cur_token.end,
975 );
976 }
977
978 fn advance(&mut self) {
980 self.prev_token_end = self.cur_token.end;
981 let token = self.lexer.next_token();
982 self.cur_token = token;
983 }
984
985 fn cur_kind(&self) -> TokenKind {
986 self.cur_token.kind
987 }
988
989 fn at(&self, kind: TokenKind) -> bool {
991 self.cur_kind() == kind
992 }
993}