From 193ea74aa24e59bd1eca7019dd817ab55b9ab9dd Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Sat, 5 Dec 2020 13:32:38 +0100 Subject: [PATCH] Allow empty returns --- examples/hello_world.sb | 2 +- src/parser/mod.rs | 11 ++++++++++- src/parser/node_type.rs | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/examples/hello_world.sb b/examples/hello_world.sb index 1221350..23e8dbd 100644 --- a/examples/hello_world.sb +++ b/examples/hello_world.sb @@ -1,6 +1,6 @@ fn main() { let x = "Hello World"; - return x; + return; } fn fib() {} \ No newline at end of file diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 7918d13..7940acf 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -169,7 +169,7 @@ impl Parser { state } TokenKind::Keyword(Keyword::Return) => { - let state = Statement::Return(self.parse_expression()?); + let state = self.parse_return()?; self.match_token(TokenKind::SemiColon)?; Ok(state) @@ -178,6 +178,15 @@ impl Parser { } } + fn parse_return(&mut self) -> Result { + // TODO: Replace unwrap with make_error + let peeked = self.peek().unwrap(); + match peeked.kind { + TokenKind::SemiColon => Ok(Statement::Return(None)), + _ => Ok(Statement::Return(Some(self.parse_expression()?))), + } + } + fn parse_expression(&mut self) -> Result { let token = self.next_token(); match token.kind { diff --git a/src/parser/node_type.rs b/src/parser/node_type.rs index 2c544a9..008898d 100644 --- a/src/parser/node_type.rs +++ b/src/parser/node_type.rs @@ -19,7 +19,7 @@ pub struct Variable { #[derive(Debug, Eq, PartialEq)] pub enum Statement { Declare(Variable, Option), - Return(Expression), + Return(Option), If(Expression, Box, Option>), While(Expression, Box), Exp(Expression),