diff --git a/src/parser/mod.rs b/src/parser/mod.rs index df4b84d..4336998 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,5 +1,6 @@ use crate::lexer::Keyword; use crate::lexer::{Token, TokenKind, Value}; +use crate::parser::node_type::Statement; use crate::parser::node_type::*; use crate::util::string_util::highlight_position_in_file; use std::iter::Peekable; @@ -210,7 +211,7 @@ impl Parser { if let Ok(_) = self.peek_token(TokenKind::BraceOpen) { let state = self.parse_function_call()?; self.match_token(TokenKind::SemiColon)?; - Ok(state) + Ok(Statement::Exp(state)) } else { let state = Statement::Exp(Expression::Variable(name.into())); Ok(state) @@ -223,7 +224,7 @@ impl Parser { /// Parses a function call from tokens. /// The name of the function needs to be passed here, because we have already passed it with our cursor. - fn parse_function_call(&mut self) -> Result { + fn parse_function_call(&mut self) -> Result { let ident_token = self.prev().ok_or_else(|| "Expected function identifier")?; let name = match &ident_token.kind { TokenKind::Identifier(name) => name, @@ -255,7 +256,7 @@ impl Parser { } self.match_token(TokenKind::BraceClose)?; - Ok(Statement::Exp(Expression::FunctionCall(name, args))) + Ok(Expression::FunctionCall(name, args)) } fn parse_return(&mut self) -> Result { @@ -279,7 +280,11 @@ impl Parser { Ok(state) } TokenKind::Identifier(val) => { - let state = Expression::Variable(val); + let next = self.peek().ok_or_else(|| "Token expected")?; + let state = match &next.kind { + TokenKind::BraceOpen => self.parse_function_call()?, + _ => Expression::Variable(val), + }; Ok(state) } other => Err(format!("Expected Expression, found {:?}", other)), diff --git a/src/parser/tests.rs b/src/parser/tests.rs index 3e2bc06..68bde8a 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -103,11 +103,10 @@ fn test_parse_function_call() { } #[test] -#[ignore] fn test_parse_return_function_call() { let raw = " fn main() { - return fib(); + return fib(2); } fn fib() { @@ -134,3 +133,19 @@ fn test_parse_function_call_multiple_arguments() { let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } + +#[test] +fn test_parse_nexted_function_call() { + let raw = " + fn main() { + fib(fib(2), 2); + } + + fn fib(n) { + return 2; + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()) +}