feat: 添加赋值运算符支持,更新解析器、解释器和词法分析器以处理相关语法
This commit is contained in:
+18
-4
@@ -202,12 +202,26 @@ impl Parser {
|
||||
fn assignment(&mut self) -> Expr {
|
||||
let expr = self.logical_or();
|
||||
|
||||
if self.match_kind(&[TokenKind::Equal]) {
|
||||
let op = if self.match_kind(&[TokenKind::Equal]) {
|
||||
Some(AssignOp::Equal)
|
||||
} else if self.match_kind(&[TokenKind::PlusEqual]) {
|
||||
Some(AssignOp::PlusEqual)
|
||||
} else if self.match_kind(&[TokenKind::MinusEqual]) {
|
||||
Some(AssignOp::MinusEqual)
|
||||
} else if self.match_kind(&[TokenKind::StarEqual]) {
|
||||
Some(AssignOp::StarEqual)
|
||||
} else if self.match_kind(&[TokenKind::SlashEqual]) {
|
||||
Some(AssignOp::SlashEqual)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
if let Some(op) = op {
|
||||
let value = self.assignment();
|
||||
return match expr {
|
||||
Expr::Variable(name) => Expr::Assign { name, value: Box::new(value) },
|
||||
Expr::Get { object, name } => Expr::Set { object, name, value: Box::new(value) },
|
||||
Expr::IndexGet { array, index } => Expr::IndexSet { array, index, value: Box::new(value) },
|
||||
Expr::Variable(name) => Expr::Assign { name, op, value: Box::new(value) },
|
||||
Expr::Get { object, name } => Expr::Set { object, name, op, value: Box::new(value) },
|
||||
Expr::IndexGet { array, index } => Expr::IndexSet { array, index, op, value: Box::new(value) },
|
||||
_ => panic!("Invalid assignment target."),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user