1use log::trace;
2use tokenizer::Token;
3
4use crate::{Input, ast::Expression};
5
6pub fn parse<'a, 'b: 'a>(mut tokens: Input<'a, 'b>) -> Result<Vec<Expression<'a>>, String> {
7 let mut expressions = vec![];
8
9 while !tokens.is_empty() && !matches!(tokens.first().unwrap().token, Token::EOF) {
10 trace!("Main parse function, remaining tokens: {}", &tokens);
11 let (new_remaining_tokens, expr) = crate::program::statement_or_expr(tokens)
12 .map_err(|err| format!("Could not parse: {}", err))?;
13 expressions.push(expr);
14 tokens = new_remaining_tokens;
15 trace!("Remaining tokens length: {}", &tokens.len());
16 trace!("Current expressions length: {}", expressions.len());
17 trace!("New remaining tokens: {}", &tokens);
18 }
19 expressions.push(Expression::EOF(tokens[0]));
20
21 Ok(expressions)
22}