assignment

This commit is contained in:
2025-05-29 19:59:34 +02:00
parent 0c38b0b6a0
commit 01cc38f31d
3 changed files with 49 additions and 6 deletions

View File

@@ -21,6 +21,10 @@ pub enum Expr {
right: Box<Expr>,
},
Variable(Token),
Assign {
name: Token,
value: Box<Expr>,
},
}
pub struct Parser {
@@ -66,7 +70,26 @@ impl Parser {
}
fn expression(&mut self) -> Result<Expr, MotError> {
self.equality()
self.assignment()
}
fn assignment(&mut self) -> Result<Expr, MotError> {
let expr = self.equality()?;
if self.match_token(&[TokenType::Equal]) {
let equals = self.previous().clone();
let value = self.assignment()?;
return match expr {
Expr::Variable(name) => Ok(Expr::Assign {
name,
value: Box::new(value),
}),
_ => return error!(equals.loc, "invalid assignment target"),
};
}
Ok(expr)
}
fn equality(&mut self) -> Result<Expr, MotError> {