[Feat] 支持 += -=等运算符!
This commit is contained in:
@@ -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},
|
||||
}; // :=
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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}}, // 右结合
|
||||
|
||||
Reference in New Issue
Block a user