tergo_parser/
parser.rs

1use log::trace;
2use tokenizer::{tokens::CommentedToken, tokens_buffer::TokensBuffer};
3
4use crate::ast::Expression;
5
6pub fn parse<'a, 'b: 'a>(
7    tokens: &'b [&'a CommentedToken<'a>],
8) -> Result<Vec<Expression<'a>>, String> {
9    let mut expressions = vec![];
10    let mut remaining_tokens = tokens;
11
12    while !remaining_tokens.is_empty() {
13        trace!(
14            "Main parse function, remaining tokens: {}",
15            TokensBuffer(remaining_tokens)
16        );
17        let (new_remaining_tokens, mut expr) = crate::program::program(remaining_tokens)
18            .map_err(|err| format!("Could not parse: {:?}", err))?;
19        expressions.append(&mut expr);
20        trace!("New remaining tokens: {}", TokensBuffer(remaining_tokens));
21        remaining_tokens = new_remaining_tokens;
22    }
23
24    Ok(expressions)
25}