From 8b67c4d59c943cf26db1d3aa6839639ba9c2ba71 Mon Sep 17 00:00:00 2001 From: Kai-Philipp Nosper Date: Fri, 4 Feb 2022 17:30:23 +0100 Subject: [PATCH] Implement block scopes (code inside braces) - Putting code in between braces will create a new scope --- src/ast.rs | 1 + src/astoptimizer.rs | 1 + src/interpreter.rs | 4 ++++ src/parser.rs | 8 ++++++++ 4 files changed, 14 insertions(+) diff --git a/src/ast.rs b/src/ast.rs index da3adc4..cccdf1d 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -113,6 +113,7 @@ pub struct If { #[derive(Debug, PartialEq, Eq, Clone)] pub enum Statement { Expr(Expression), + Block(BlockScope), Loop(Loop), If(If), Print(Expression), diff --git a/src/astoptimizer.rs b/src/astoptimizer.rs index 39775a5..84bf5e5 100644 --- a/src/astoptimizer.rs +++ b/src/astoptimizer.rs @@ -18,6 +18,7 @@ impl SimpleAstOptimizer { for stmt in block { match stmt { Statement::Expr(expr) => Self::optimize_expr(expr), + Statement::Block(block) => Self::optimize_block(block), Statement::Loop(Loop { condition, advancement, diff --git a/src/interpreter.rs b/src/interpreter.rs index 0096a14..88327ca 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -78,6 +78,10 @@ impl Interpreter { self.resolve_expr(expr); } + Statement::Block(block) => { + self.run_block(block); + } + Statement::Loop(looop) => { // loop runs as long condition != 0 loop { diff --git a/src/parser.rs b/src/parser.rs index 3391209..7ab2892 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -50,6 +50,14 @@ impl> Parser { } Token::EoF | Token::RBraces => break, + Token::LBraces => { + self.next(); + prog.push(Statement::Block(self.parse_scoped_block())); + if !matches!(self.next(), Token::RBraces) { + panic!("Error parsing block: Expectected closing braces '}}'"); + } + } + // By default try to lex a statement _ => prog.push(self.parse_stmt()), }