[Feat] 支持 += -=等运算符!

This commit is contained in:
2025-12-26 21:59:52 +08:00
parent 8a047de1c7
commit 20f39b7eba
3 changed files with 69 additions and 1 deletions

View File

@@ -222,7 +222,13 @@ namespace Fig::Ast
ShiftRight, // >>
// 赋值表达式
Assign, // =
Assign, // =
PlusAssign, // +=
MinusAssign, // -=
AsteriskAssign, // *=
SlashAssign, // /=
PercentAssign, // %=
CaretAssign, // ^=
// Walrus, // :=
};
@@ -255,6 +261,13 @@ namespace Fig::Ast
Operator::ShiftLeft,
Operator::ShiftRight,
Operator::Assign,
Operator::PlusAssign,
Operator::MinusAssign,
Operator::AsteriskAssign,
Operator::SlashAssign,
Operator::CaretAssign
// Operator::Walrus,
// Operator::Dot
};
@@ -297,6 +310,12 @@ namespace Fig::Ast
// 赋值表达式
{TokenType::Assign, Operator::Assign},
{TokenType::PlusEqual, Operator::PlusAssign},
{TokenType::MinusEqual, Operator::MinusAssign},
{TokenType::AsteriskEqual, Operator::AsteriskAssign},
{TokenType::SlashEqual, Operator::SlashAssign},
{TokenType::PercentEqual, Operator::PercentAssign},
{TokenType::CaretEqual, Operator::CaretAssign},
// {TokenType::Walrus, Operator::Walrus},
}; // :=

View File

@@ -289,12 +289,55 @@ namespace Fig
ObjectPtr rhs = eval(rexp, ctx);
return std::make_shared<Object>(shift_right(*lhs, *rhs));
}
case Operator::Assign: {
LvObject lv = evalLv(lexp, ctx);
ObjectPtr rhs = eval(rexp, ctx);
lv.set(rhs);
return rhs;
}
case Operator::PlusAssign: {
LvObject lv = evalLv(lexp, ctx);
ObjectPtr rhs = eval(rexp, ctx);
lv.set(std::make_shared<Object>(
*(lv.get()) + *rhs
));
return rhs;
}
case Operator::MinusAssign: {
LvObject lv = evalLv(lexp, ctx);
ObjectPtr rhs = eval(rexp, ctx);
lv.set(std::make_shared<Object>(
*(lv.get()) - *rhs));
return rhs;
}
case Operator::AsteriskAssign: {
LvObject lv = evalLv(lexp, ctx);
ObjectPtr rhs = eval(rexp, ctx);
lv.set(std::make_shared<Object>(
*(lv.get()) * (*rhs)));
return rhs;
}
case Operator::SlashAssign: {
LvObject lv = evalLv(lexp, ctx);
ObjectPtr rhs = eval(rexp, ctx);
lv.set(std::make_shared<Object>(
*(lv.get()) / *rhs));
return rhs;
}
case Operator::PercentAssign: {
LvObject lv = evalLv(lexp, ctx);
ObjectPtr rhs = eval(rexp, ctx);
lv.set(std::make_shared<Object>(
*(lv.get()) / *rhs));
return rhs;
}
// case Operator::CaretAssign: {
// LvObject lv = evalLv(lexp, ctx);
// ObjectPtr rhs = eval(rexp, ctx);
// lv.set(std::make_shared<Object>(
// *(lv.get()) ^ *rhs));
// }
default:
throw EvaluatorError(u8"UnsupportedOp", std::format("Unsupport operator '{}' for binary", magic_enum::enum_name(op)), bin);
}

View File

@@ -35,6 +35,12 @@ namespace Fig
{Ast::Operator::ShiftRight, {15, 16}},
{Ast::Operator::Assign, {2, 1}}, // 右结合
{Ast::Operator::PlusAssign, {2, 1}},
{Ast::Operator::MinusAssign, {2, 1}},
{Ast::Operator::SlashAssign, {2, 1}},
{Ast::Operator::AsteriskAssign, {2, 1}},
{Ast::Operator::PercentAssign, {2, 1}},
{Ast::Operator::CaretAssign, {2, 1}},
// 海象运算符
// {Ast::Operator::Walrus, {2, 1}}, // 右结合