pseudo_interpreter/parser/functions/
parse_token.rs1use 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}