htmls/parser/
function.rs

1use crate::lexer::Token;
2use crate::parser::ast::{FunctionNode, Node};
3use crate::parser::error::ParseError;
4
5use super::ast::Literal;
6use super::{literal, Parser};
7
8/// Parse function calls
9pub fn parse_function(it: &mut Parser, mut node: Node) -> Result<Node, ParseError> {
10    while let Some((Token::Function(function_name), _, _)) = &it.current_token {
11        let function_name = function_name.clone();
12        if function_name.is_empty() {
13            let (line, column) = it.get_current_position();
14            return Err(ParseError::syntax_error("Function name cannot be empty.", line, column));
15        }
16        it.read_token();
17
18        it.check_depth()?;
19
20        let arguments = parse_function_arguments(it)?;
21
22        let function_node = FunctionNode {
23            name: function_name,
24            arguments,
25        };
26
27        node = Node::FunctionCall(Box::new(node), function_node);
28
29        it.decrease_depth();
30    }
31
32    Ok(node)
33}
34
35/// Parse the function parameter list
36fn parse_function_arguments(it: &mut Parser) -> Result<Vec<Literal>, ParseError> {
37    let mut arguments = Vec::new();
38
39    while let Some((Token::Comma, _, _)) = &it.current_token {
40
41        it.consume_token(&Token::Comma)?;
42
43        let val = literal::parse_literal(it)?;
44
45        arguments.push(val);
46    }
47
48    Ok(arguments)
49}