refactor(literal): remove the Option wrapper for literal for Expr

Simplifies other aspect of the code. Having the LiteralType be wrapped
in an Option was a mistake (i was super sleepy when i was writing that
code :D)
This commit is contained in:
Seymur Bagirov 2025-01-06 01:43:12 +04:00
parent 9f903556f9
commit 8b29a43900
3 changed files with 19 additions and 15 deletions

View File

@ -18,7 +18,7 @@ pub enum Expr {
expression: Box<Expr>, expression: Box<Expr>,
}, },
Literal { Literal {
value: Option<LiteralType>, value: LiteralType,
}, },
Unary { Unary {
op: Token, op: Token,

View File

@ -99,25 +99,30 @@ impl Parser<'_> {
use LiteralType::*; use LiteralType::*;
use TokenType::*; use TokenType::*;
fn create_literal(l_type: Option<LiteralType>) -> Expr { fn create_literal(l_type: LiteralType) -> Expr {
Expr::Literal { value: l_type } Expr::Literal { value: l_type }
} }
if self.match_token(&[False]) { if self.match_token(&[False]) {
return Ok(create_literal(Some(Bool(false)))); return Ok(create_literal(Bool(false)));
} }
if self.match_token(&[True]) { if self.match_token(&[True]) {
return Ok(create_literal(Some(Bool(true)))); return Ok(create_literal(Bool(true)));
} }
if self.match_token(&[TokenType::Number, TokenType::String]) { if self.match_token(&[TokenType::Number, TokenType::String]) {
return Ok(create_literal(self.previous().literal.clone())); return Ok(create_literal(
self.previous()
.literal
.clone()
.expect("The number and string token should have a literal"),
));
} }
// i included the enum name bcs of ambiguity of LiteralType and TokenType // i included the enum name bcs of ambiguity of LiteralType and TokenType
if self.match_token(&[TokenType::Nil]) { if self.match_token(&[TokenType::Nil]) {
return Ok(create_literal(Some(LiteralType::Nil))); return Ok(create_literal(LiteralType::Nil));
} }
if self.match_token(&[LeftParen]) { if self.match_token(&[LeftParen]) {

View File

@ -5,11 +5,10 @@ pub fn pretty_print(expr: &Expr) -> String {
Expr::Binary { left, op, right } => parenthesize(&op.lexeme, &[left, right]), Expr::Binary { left, op, right } => parenthesize(&op.lexeme, &[left, right]),
Expr::Grouping { expression } => parenthesize("group", &[expression]), Expr::Grouping { expression } => parenthesize("group", &[expression]),
Expr::Literal { value } => match value { Expr::Literal { value } => match value {
Some(LiteralType::String(v)) => v.to_string(), LiteralType::String(v) => v.to_string(),
Some(LiteralType::Number(v)) => v.to_string(), LiteralType::Number(v) => v.to_string(),
Some(LiteralType::Bool(v)) => v.to_string(), LiteralType::Bool(v) => v.to_string(),
Some(LiteralType::Nil) => "Nil".to_string(), LiteralType::Nil => "Nil".to_string(),
None => "None".to_string(),
}, },
Expr::Unary { op, right } => parenthesize(&op.lexeme, &[right]), Expr::Unary { op, right } => parenthesize(&op.lexeme, &[right]),
Expr::Ternary { Expr::Ternary {
@ -50,7 +49,7 @@ mod test {
use TokenType::*; use TokenType::*;
let expression = Binary { let expression = Binary {
left: Box::new(Literal { left: Box::new(Literal {
value: Some(LiteralType::Number(10.2)), value: LiteralType::Number(10.2),
}), }),
op: Token { op: Token {
t_type: Plus, t_type: Plus,
@ -59,7 +58,7 @@ mod test {
line: 0, line: 0,
}, },
right: Box::new(Literal { right: Box::new(Literal {
value: Some(LiteralType::Number(10.2)), value: LiteralType::Number(10.2),
}), }),
}; };
@ -77,13 +76,13 @@ mod test {
left: Box::new(Unary { left: Box::new(Unary {
op: Token::new(Minus, "-", None, 0), op: Token::new(Minus, "-", None, 0),
right: Box::new(Expr::Literal { right: Box::new(Expr::Literal {
value: Some(LiteralType::number_literal(123.0)), value: LiteralType::number_literal(123.0),
}), }),
}), }),
op: Token::new(Star, "*", None, 0), op: Token::new(Star, "*", None, 0),
right: Box::new(Grouping { right: Box::new(Grouping {
expression: Box::new(Literal { expression: Box::new(Literal {
value: Some(LiteralType::number_literal(45.67)), value: LiteralType::number_literal(45.67),
}), }),
}), }),
}; };