Implement debug print

This commit is contained in:
Daniel M 2022-01-28 20:09:15 +01:00
parent d035724d20
commit 3dacee0be4
3 changed files with 15 additions and 2 deletions

View File

@ -22,8 +22,11 @@ impl Interpreter {
for stmt in prog.prog { for stmt in prog.prog {
match stmt { match stmt {
Stmt::Expr(expr) => { Stmt::Expr(expr) => {
self.resolve_expr(expr);
}
Stmt::DbgPrint(expr) => {
let result = self.resolve_expr(expr); let result = self.resolve_expr(expr);
println!("Result = {:?}", result); println!("{:?}", result);
} }
Stmt::Let(name, rhs) => { Stmt::Let(name, rhs) => {
let result = self.resolve_expr(rhs); let result = self.resolve_expr(rhs);

View File

@ -22,6 +22,9 @@ pub enum Token {
/// Identifier (variable / function / ... name) /// Identifier (variable / function / ... name)
Ident(String), Ident(String),
/// Dollar sign ($)
Dollar,
/// Let identifier (let) /// Let identifier (let)
Let, Let,
@ -175,6 +178,7 @@ impl<'a> Lexer<'a> {
';' => tokens.push(Token::Semicolon), ';' => tokens.push(Token::Semicolon),
'{' => tokens.push(Token::LBrace), '{' => tokens.push(Token::LBrace),
'}' => tokens.push(Token::RBrace), '}' => tokens.push(Token::RBrace),
'$' => tokens.push(Token::Dollar),
'a'..='z' | 'A'..='Z' | '_' => { 'a'..='z' | 'A'..='Z' | '_' => {
let mut ident = String::from(ch); let mut ident = String::from(ch);

View File

@ -75,6 +75,7 @@ pub enum Stmt {
Let(String, Expr), Let(String, Expr),
While(Expr, Ast), While(Expr, Ast),
If(Expr, Ast, Ast), If(Expr, Ast, Ast),
DbgPrint(Expr),
} }
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]
@ -108,7 +109,8 @@ stmt_expr = expr
stmt_let = "let" IDENT "=" expr stmt_let = "let" IDENT "=" expr
stmt_while = "while" expr "{" (stmt)* "}" stmt_while = "while" expr "{" (stmt)* "}"
stmt_if = "if" expr "{" (stmt)* "}" ( "else" "{" (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<T: Iterator<Item = Token>> { struct Parser<T: Iterator<Item = Token>> {
@ -136,6 +138,10 @@ impl<T: Iterator<Item = Token>> Parser<T> {
Token::Let => self.parse_let_stmt(), Token::Let => self.parse_let_stmt(),
Token::While => self.parse_while(), Token::While => self.parse_while(),
Token::If => self.parse_if(), Token::If => self.parse_if(),
Token::Dollar => {
self.next();
Stmt::DbgPrint(self.parse_expr())
}
// By default try to parse an expression // By default try to parse an expression
_ => Stmt::Expr(self.parse_expr()), _ => Stmt::Expr(self.parse_expr()),
}; };