mirror of
https://github.com/Alvin-Zilverstand/Tralalero_lang.git
synced 2026-03-06 11:17:06 +01:00
feat: Implement else statements
This commit is contained in:
12
README.md
12
README.md
@@ -60,12 +60,18 @@ 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"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
Ballerina Cappuccina
|
||||
{
|
||||
Matteeeo "x is not greater than 10"
|
||||
}
|
||||
Bombardiro Crocodilo
|
||||
47
src/main.rs
47
src/main.rs
@@ -122,30 +122,63 @@ fn parse_and_execute(pc: usize, lines: &Vec<&str>, variables: &mut HashMap<Strin
|
||||
_ => 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;
|
||||
}
|
||||
return block_end + 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 next_pc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user