Browse Source

Fix return with expression

github-actions
Garrit Franke 3 years ago
parent
commit
002d69af49
  1. 13
      src/parser/mod.rs
  2. 19
      src/parser/tests.rs

13
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<Statement, String> {
fn parse_function_call(&mut self) -> Result<Expression, String> {
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<Statement, String> {
@ -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)),

19
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())
}

Loading…
Cancel
Save