forked from PuqiAR/Fig-TreeWalker
[Feat] 支持 += -=等运算符!
This commit is contained in:
@@ -223,6 +223,12 @@ namespace Fig::Ast
|
|||||||
|
|
||||||
// 赋值表达式
|
// 赋值表达式
|
||||||
Assign, // =
|
Assign, // =
|
||||||
|
PlusAssign, // +=
|
||||||
|
MinusAssign, // -=
|
||||||
|
AsteriskAssign, // *=
|
||||||
|
SlashAssign, // /=
|
||||||
|
PercentAssign, // %=
|
||||||
|
CaretAssign, // ^=
|
||||||
// Walrus, // :=
|
// Walrus, // :=
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -255,6 +261,13 @@ namespace Fig::Ast
|
|||||||
Operator::ShiftLeft,
|
Operator::ShiftLeft,
|
||||||
Operator::ShiftRight,
|
Operator::ShiftRight,
|
||||||
|
|
||||||
|
Operator::Assign,
|
||||||
|
Operator::PlusAssign,
|
||||||
|
Operator::MinusAssign,
|
||||||
|
Operator::AsteriskAssign,
|
||||||
|
Operator::SlashAssign,
|
||||||
|
Operator::CaretAssign
|
||||||
|
|
||||||
// Operator::Walrus,
|
// Operator::Walrus,
|
||||||
// Operator::Dot
|
// Operator::Dot
|
||||||
};
|
};
|
||||||
@@ -297,6 +310,12 @@ namespace Fig::Ast
|
|||||||
|
|
||||||
// 赋值表达式
|
// 赋值表达式
|
||||||
{TokenType::Assign, Operator::Assign},
|
{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},
|
// {TokenType::Walrus, Operator::Walrus},
|
||||||
}; // :=
|
}; // :=
|
||||||
|
|
||||||
|
|||||||
@@ -289,12 +289,55 @@ namespace Fig
|
|||||||
ObjectPtr rhs = eval(rexp, ctx);
|
ObjectPtr rhs = eval(rexp, ctx);
|
||||||
return std::make_shared<Object>(shift_right(*lhs, *rhs));
|
return std::make_shared<Object>(shift_right(*lhs, *rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
case Operator::Assign: {
|
case Operator::Assign: {
|
||||||
LvObject lv = evalLv(lexp, ctx);
|
LvObject lv = evalLv(lexp, ctx);
|
||||||
ObjectPtr rhs = eval(rexp, ctx);
|
ObjectPtr rhs = eval(rexp, ctx);
|
||||||
lv.set(rhs);
|
lv.set(rhs);
|
||||||
return 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:
|
default:
|
||||||
throw EvaluatorError(u8"UnsupportedOp", std::format("Unsupport operator '{}' for binary", magic_enum::enum_name(op)), bin);
|
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::ShiftRight, {15, 16}},
|
||||||
|
|
||||||
{Ast::Operator::Assign, {2, 1}}, // 右结合
|
{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}}, // 右结合
|
// {Ast::Operator::Walrus, {2, 1}}, // 右结合
|
||||||
|
|||||||
Reference in New Issue
Block a user