Implement debug print
This commit is contained in:
parent
d035724d20
commit
3dacee0be4
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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()),
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user