feat: 添加赋值运算符支持,更新解析器、解释器和词法分析器以处理相关语法

This commit is contained in:
0264408
2026-06-16 08:55:21 +08:00
parent ae3060708d
commit a40c8d1e9e
6 changed files with 123 additions and 13 deletions
+18 -4
View File
@@ -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."),
};
}