pseudo_interpreter/parser/functions/
parse_token.rs

1use crate::{
2    constants::error_handler::{KeywordError, PseudoError},
3    parser::{ParseArray, ParseFunction, ParseInput},
4};
5
6use super::super::{
7    ParseAssignment, ParseDeclare, ParseFor, ParseIf, ParsePrintExpr, ParseWhile, Parser,
8    Statement, Token,
9};
10pub trait ParseToken {
11    fn parse_token(&mut self, termintators: Vec<Token>) -> Result<Vec<Statement>, PseudoError>;
12}
13
14impl ParseToken for Parser {
15    fn parse_token(&mut self, terminators: Vec<Token>) -> Result<Vec<Statement>, PseudoError> {
16        let mut statements: Vec<Statement> = Vec::new();
17        while let Some(token) = &self.current_token {
18            if terminators.contains(token) {
19                if token != &Token::Else && token != &Token::ElseIf && token != &Token::Return {
20                    self.next_token();
21                }
22                break;
23            }
24            match token {
25                Token::Print => statements.push(self.parse_print()?),
26                Token::Input => statements.push(self.parse_input()?),
27                Token::Ident(_) => statements.push(self.parse_assignment()?),
28                Token::Array(_, _) => statements.push(self.parse_array()?),
29                Token::While => statements.push(self.parse_while()?),
30                Token::If => statements.push(self.parse_if()?),
31                Token::For => statements.push(self.parse_for()?),
32                Token::Function => statements.push(self.parse_function()?),
33                Token::EOL => self.next_token(),
34                Token::Number(_) | Token::Str(_) | Token::Boolean(_) => {
35                    statements.push(Statement::Expr(self.parse_expr()?))
36                }
37                Token::Declare => statements.push(self.parse_declare()?),
38                Token::RParen => self.next_token(),
39                Token::Break => {
40                    self.next_token();
41                    statements.push(Statement::Break);
42                }
43                _ => return Err(PseudoError::keyword(terminators, &token)),
44            }
45        }
46        Ok(statements)
47    }
48}