From 1cf708d0fd658a50831ae5ea3dfc83d438e61f32 Mon Sep 17 00:00:00 2001 From: Alvin <524715@vistacollege.nl> Date: Wed, 10 Sep 2025 12:55:26 +0200 Subject: [PATCH] feat: Implement else statements --- README.md | 14 +++++++++---- conditional.tralla | 12 ++++++++---- src/main.rs | 49 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 0a66aa1..f809bd1 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,19 @@ Matteeeo result // prints 15 This command executes a block of code if a condition is true. The supported operators are `==`, `!=`, `>`, `<`, `>=`, `<=`. +This can be followed by a `Ballerina Cappuccina` block to execute code if the condition is false. + Example: ```tralalero -Biscottini x 10 -Tung Tung Tung x > 5 +Biscottini x 5 +Tung Tung Tung x > 10 { - Matteeeo "x is greater than 5" + Matteeeo "x is greater than 10" +} +Ballerina Cappuccina +{ + Matteeeo "x is not greater than 10" } ``` -## Ciao! +## Ciao! \ No newline at end of file diff --git a/conditional.tralla b/conditional.tralla index 35847fc..eeaeecd 100644 --- a/conditional.tralla +++ b/conditional.tralla @@ -1,7 +1,11 @@ Tralalero Tralala -Biscottini x 10 -Tung Tung Tung x > 5 +Biscottini x 5 +Tung Tung Tung x > 10 { - Matteeeo "x is greater than 5" + Matteeeo "x is greater than 10" } -Bombardiro Crocodilo +Ballerina Cappuccina +{ + Matteeeo "x is not greater than 10" +} +Bombardiro Crocodilo \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 3b07069..70de80d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -122,34 +122,67 @@ fn parse_and_execute(pc: usize, lines: &Vec<&str>, variables: &mut HashMap false, }; - let block_start = pc + 2; - let mut block_end = block_start; + let if_block_start = pc + 2; + let mut if_block_end = if_block_start; let mut brace_count = 1; - for i in block_start..lines.len() { + for i in if_block_start..lines.len() { if lines[i].trim() == "{" { brace_count += 1; } if lines[i].trim() == "}" { brace_count -= 1; if brace_count == 0 { - block_end = i; + if_block_end = i; break; } } } + let mut next_pc = if_block_end + 1; + if condition { - let mut inner_pc = block_start; - while inner_pc < block_end { + let mut inner_pc = if_block_start; + while inner_pc < if_block_end { inner_pc = parse_and_execute(inner_pc, lines, variables); } + } else { + // Check for an else block + if let Some(next_line) = lines.get(if_block_end + 1) { + let mut next_words = next_line.trim().split_whitespace(); + if let Some(else_keyword) = next_words.next() { + if else_keyword == "Ballerina" && next_words.next() == Some("Cappuccina") { + let else_block_start = if_block_end + 3; + let mut else_block_end = else_block_start; + let mut brace_count = 1; + + for i in else_block_start..lines.len() { + if lines[i].trim() == "{" { + brace_count += 1; + } + if lines[i].trim() == "}" { + brace_count -= 1; + if brace_count == 0 { + else_block_end = i; + break; + } + } + } + + let mut inner_pc = else_block_start; + while inner_pc < else_block_end { + inner_pc = parse_and_execute(inner_pc, lines, variables); + } + next_pc = else_block_end + 1; + } + } + } } - return block_end + 1; + return next_pc; } } } } } pc + 1 -} \ No newline at end of file +}