diff --git a/src/interpreter.rs b/src/interpreter.rs index aa946b5..0447643 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -22,8 +22,11 @@ impl Interpreter { for stmt in prog.prog { match stmt { Stmt::Expr(expr) => { + self.resolve_expr(expr); + } + Stmt::DbgPrint(expr) => { let result = self.resolve_expr(expr); - println!("Result = {:?}", result); + println!("{:?}", result); } Stmt::Let(name, rhs) => { let result = self.resolve_expr(rhs); diff --git a/src/lexer.rs b/src/lexer.rs index fb3194a..75b15d7 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -22,6 +22,9 @@ pub enum Token { /// Identifier (variable / function / ... name) Ident(String), + /// Dollar sign ($) + Dollar, + /// Let identifier (let) Let, @@ -175,6 +178,7 @@ impl<'a> Lexer<'a> { ';' => tokens.push(Token::Semicolon), '{' => tokens.push(Token::LBrace), '}' => tokens.push(Token::RBrace), + '$' => tokens.push(Token::Dollar), 'a'..='z' | 'A'..='Z' | '_' => { let mut ident = String::from(ch); diff --git a/src/parser.rs b/src/parser.rs index fc8a297..ac51b42 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -75,6 +75,7 @@ pub enum Stmt { Let(String, Expr), While(Expr, Ast), If(Expr, Ast, Ast), + DbgPrint(Expr), } #[derive(Debug, PartialEq, Eq, Clone)] @@ -108,7 +109,8 @@ stmt_expr = expr stmt_let = "let" IDENT "=" expr stmt_while = "while" expr "{" (stmt)* "}" stmt_if = "if" expr "{" (stmt)* "}" ( "else" "{" (stmt)* "}" ) -stmt = stmt_expr | stmt_let | stmt_while | stmt_if +stmt_dbgprint = "$" expr +stmt = stmt_expr | stmt_let | stmt_while | stmt_if | stmt_dbgprint */ struct Parser> { @@ -136,6 +138,10 @@ impl> Parser { Token::Let => self.parse_let_stmt(), Token::While => self.parse_while(), Token::If => self.parse_if(), + Token::Dollar => { + self.next(); + Stmt::DbgPrint(self.parse_expr()) + } // By default try to parse an expression _ => Stmt::Expr(self.parse_expr()), };