Browse Source

Allow empty returns

github-actions
Garrit Franke 3 years ago
parent
commit
193ea74aa2
  1. 2
      examples/hello_world.sb
  2. 11
      src/parser/mod.rs
  3. 2
      src/parser/node_type.rs

2
examples/hello_world.sb

@ -1,6 +1,6 @@
fn main() {
let x = "Hello World";
return x;
return;
}
fn fib() {}

11
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<Statement, String> {
// 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<Expression, String> {
let token = self.next_token();
match token.kind {

2
src/parser/node_type.rs

@ -19,7 +19,7 @@ pub struct Variable {
#[derive(Debug, Eq, PartialEq)]
pub enum Statement {
Declare(Variable, Option<Expression>),
Return(Expression),
Return(Option<Expression>),
If(Expression, Box<Statement>, Option<Box<Statement>>),
While(Expression, Box<Statement>),
Exp(Expression),

Loading…
Cancel
Save