diff options
| -rw-r--r-- | src/compiler.rs | 13 | ||||
| -rw-r--r-- | src/lib.rs | 1 | ||||
| -rw-r--r-- | tests/for.tdy | 19 |
3 files changed, 31 insertions, 2 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index f84f9f8..b7e946c 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -380,9 +380,14 @@ impl Compiler { } } + //TODO de-complexify fn for_loop(&mut self, block: &mut Block) { expect!(self, Token::For, "Expected 'for' at start of for-loop."); + // push outer scope for loop variable + self.level += 1; + let h = self.stack.len(); + // Definition match self.peek_four() { (Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual, ..) => { @@ -433,8 +438,12 @@ impl Compiler { block.patch(Op::JmpFalse(block.curr()), cond_out); - // Loop variable - block.add(Op::Pop, self.line()); + // pop outer scope + self.level -= 1; + for _ in h..self.stack.len() { + block.add(Op::Pop, self.line()); + } + self.stack.truncate(h); } fn statement(&mut self, block: &mut Block) { @@ -64,4 +64,5 @@ mod tests { test_file!(variables, "tests/variables.tdy"); test_file!(scoping, "tests/scoping.tdy"); test_file!(if_, "tests/if.tdy"); + test_file!(for_, "tests/for.tdy"); } diff --git a/tests/for.tdy b/tests/for.tdy new file mode 100644 index 0000000..a9f8cd2 --- /dev/null +++ b/tests/for.tdy @@ -0,0 +1,19 @@ +a := 0 +for i := 0, i < 3, i = i + 1 { + a = a + i +} +a <=> 3 + +a = 0 +for i := 0, i <= 3, i = i + 1 { + a = a + i +} +a <=> 6 + +a = 0 +for i := 0, i < 3, i = i + 1 { + for j := 0, j < 3, j = j + 1 { + a = a + i * j + } +} +a <=> 9 |
