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
8pub 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
35fn 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}