assignment
This commit is contained in:
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user