tergo_parser/
parser.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use log::trace;
use tokenizer::{tokens::CommentedToken, tokens_buffer::TokensBuffer};

use crate::ast::Expression;

pub fn parse<'a, 'b: 'a>(
    tokens: &'b [&'a CommentedToken<'a>],
) -> Result<Vec<Expression<'a>>, String> {
    let mut expressions = vec![];
    let mut remaining_tokens = tokens;

    while !remaining_tokens.is_empty() {
        trace!(
            "Main parse function, remaining tokens: {}",
            TokensBuffer(remaining_tokens)
        );
        let (new_remaining_tokens, mut expr) = crate::program::program(remaining_tokens)
            .map_err(|err| format!("Could not parse: {:?}", err))?;
        expressions.append(&mut expr);
        trace!("New remaining tokens: {}", TokensBuffer(remaining_tokens));
        remaining_tokens = new_remaining_tokens;
    }

    Ok(expressions)
}