diff --git a/examples/playground.sb b/examples/playground.sb index 90b740c..ce96d94 100644 --- a/examples/playground.sb +++ b/examples/playground.sb @@ -1,8 +1,10 @@ fn main() { - let num = 10 + let num = 5 if num > 5 { return num - } else if num <= 5 { + } else if num < 5 { return 1 + } else { + return num + 1 } } \ No newline at end of file diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 8eef3a3..00fe81f 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -318,10 +318,22 @@ impl Parser { match self.peek() { Some(tok) if tok.kind == TokenKind::Keyword(Keyword::Else) => { self.next_token(); + + let peeked = self.peek().ok_or_else(|| "Token expected")?; + + let has_else = match &peeked.kind { + TokenKind::CurlyBracesOpen => Some(self.parse_block()?), + _ => None, + }; + + let else_branch = match has_else { + Some(branch) => branch, + None => self.parse_conditional_statement()?, + }; Ok(Statement::If( condition, Box::new(body), - Some(Box::new(self.parse_conditional_statement()?)), + Some(Box::new(else_branch)), )) } _ => Ok(Statement::If(condition, Box::new(body), None)), diff --git a/src/parser/tests.rs b/src/parser/tests.rs index 2267df4..7ca2008 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -298,3 +298,41 @@ fn test_parse_conditional_multiple_else_if_branch_branches() { let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } + +#[test] +fn test_parse_conditional_else_branch() { + let raw = " + fn main(n) { + if n > 10 { + let x = 2 * n + return x + } else { + return n + } + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()) +} + +#[test] +fn test_parse_conditional_elseif_else_branch() { + let raw = " + fn main(n) { + if n > 10 { + let x = 2 * n + return x + } else if n < 10 { + return n + } else if n == 10 { + return n + 1 + } else { + return n + } + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()) +}