luaparser/parser/
parse_chunk.rs

1use crate::parser::{
2    parse_statement,
3    try_parse_last_statement,
4    ParsingError,
5};
6use crate::parser::token_utils::{
7    skip_first_token_if_is_symbol,
8    LuaSymbol,
9};
10use crate::parser::node_types::NodeTypes;
11
12use lualexer::Token;
13
14pub fn parse_chunk<'a, T: NodeTypes>(tokens: &'a [Token<'a>]) -> Result<T::Block, ParsingError> {
15    let mut statements = vec!();
16    let mut current_tokens = tokens;
17
18    while let Some(_token) = current_tokens.first() {
19        if let Some((last_statement, mut next_tokens)) = try_parse_last_statement::<T>(current_tokens)? {
20            next_tokens = skip_first_token_if_is_symbol(next_tokens, LuaSymbol::SemiColon)
21                .unwrap_or(next_tokens);
22            let block = T::Block::from((statements, Some(last_statement)));
23
24            return if next_tokens.first().is_some() {
25                Err(ParsingError::EndExpectedAfterLastStatement)
26            } else {
27                Ok(block)
28            }
29        }
30
31        let (statement, next_tokens) = parse_statement::<T>(current_tokens)?;
32
33        statements.push(statement);
34        current_tokens = skip_first_token_if_is_symbol(next_tokens, LuaSymbol::SemiColon)
35            .unwrap_or(next_tokens);
36    };
37
38    Ok(T::Block::from((statements, None)))
39}