From aaab0a4b2819a696c1790d5977ac1b51901cabbf Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Tue, 8 Dec 2020 21:25:56 +0100 Subject: [PATCH] Add conditional else if branch --- examples/playground.sb | 13 +++++-------- src/generator/js.rs | 5 +++++ src/parser/mod.rs | 12 +++++++++++- src/parser/tests.rs | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/examples/playground.sb b/examples/playground.sb index e51fc19..90b740c 100644 --- a/examples/playground.sb +++ b/examples/playground.sb @@ -1,11 +1,8 @@ fn main() { let num = 10 - return fib(num) -} - -fn fib(n) { - if 1 >= n { - return n + if num > 5 { + return num + } else if num <= 5 { + return 1 } - return fib(n-1) + fib(n-2) -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/generator/js.rs b/src/generator/js.rs index 83a6c5a..1a9a57e 100644 --- a/src/generator/js.rs +++ b/src/generator/js.rs @@ -75,6 +75,11 @@ fn generate_conditional( outcome += &generate_statement(statement); } outcome += "}"; + + if let Some(else_state) = else_state { + outcome += "else "; + outcome += &generate_statement(else_state); + } outcome } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 9bbc6bc..ca10991 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -316,7 +316,17 @@ impl Parser { self.match_token(TokenKind::CurlyBracesClose)?; - Ok(Statement::If(condition, statements, None)) + match self.peek() { + Some(tok) if tok.kind == TokenKind::Keyword(Keyword::Else) => { + self.next_token(); + Ok(Statement::If( + condition, + statements, + Some(Box::new(self.parse_conditional_statement()?)), + )) + } + _ => Ok(Statement::If(condition, statements, None)), + } } /// In some occurences a complex expression has been evaluated before a binary operation is encountered. diff --git a/src/parser/tests.rs b/src/parser/tests.rs index c1b89b6..2267df4 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -262,3 +262,39 @@ fn test_parse_basic_conditional_with_multiple_statements() { let tree = parse(tokens, Some(raw.to_string())); assert!(tree.is_ok()) } + +#[test] +fn test_parse_conditional_else_if_branch() { + let raw = " + fn main(n) { + if n > 10 { + let x = 2 * n + return x + } else if n <= 10 { + return n + } + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()) +} + +#[test] +fn test_parse_conditional_multiple_else_if_branch_branches() { + 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 + } + } + "; + let tokens = tokenize(raw); + let tree = parse(tokens, Some(raw.to_string())); + assert!(tree.is_ok()) +}