diff --git a/src/ast.rs b/src/ast.rs index 6ab95fc..27e843f 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -5,6 +5,7 @@ pub trait Expr: Stmt {} pub enum NodeType { Program(Program), NumericLiteral(NumericLiteral), + NullLiteral(NullLiteral), Identifier(Identifier), BinaryExpr(BinaryExpr), EOF, @@ -32,6 +33,9 @@ pub struct NumericLiteral { pub value: f64, } +#[derive(Debug)] +pub struct NullLiteral {} + impl Stmt for Program {} impl Stmt for NumericLiteral {} diff --git a/src/lexer.rs b/src/lexer.rs index ae6861a..505ec39 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -21,18 +21,20 @@ pub mod interpreter { #[derive(Clone)] pub enum Token { - Number(String), - Identifier(String), - Equals, - Let, - OpenParen, - CloseParen, BinaryOperator(String), + Identifier(String), + Number(String), + CloseParen, + OpenParen, + Equals, + Null, + Let, EOF, } static KEYWORDS: phf::Map<&'static str, Token> = phf::phf_map! { "let" => Token::Let, + "null" => Token::Null, }; impl Token { @@ -79,6 +81,7 @@ pub mod interpreter { Token::OpenParen => write!(f, "Token::OpenParen"), Token::CloseParen => write!(f, "Token::CloseParen"), Token::EOF => write!(f, "Token::EOF"), + Token::Null => write!(f, "Token::Null"), } } } diff --git a/src/parser.rs b/src/parser.rs index c420047..04f9ca0 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,6 +1,6 @@ use std::process; -use crate::ast::{BinaryExpr, Identifier, NodeType, NumericLiteral, Program}; +use crate::ast::{BinaryExpr, Identifier, NodeType, NullLiteral, NumericLiteral, Program}; use crate::lexer::interpreter; pub struct Parser { @@ -50,6 +50,7 @@ impl Parser { Token::Number(n) => NodeType::NumericLiteral(NumericLiteral { value: n.parse().expect(&format!("Failed to parse number: {}", n)), }), + Token::Null => NodeType::NullLiteral(NullLiteral {}), Token::EOF => NodeType::EOF, Token::OpenParen => {