tergo_parser/
parser.rs

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}