diff --git a/src/script/C4AulAST.h b/src/script/C4AulAST.h index 78c09c084..212ce7eac 100644 --- a/src/script/C4AulAST.h +++ b/src/script/C4AulAST.h @@ -37,6 +37,7 @@ namespace aul { namespace ast { class VarExpr; class UnOpExpr; class BinOpExpr; + class AssignmentExpr; class SubscriptExpr; class SliceExpr; class CallExpr; @@ -75,6 +76,7 @@ public: virtual void visit(const ::aul::ast::VarExpr *n) {} virtual void visit(const ::aul::ast::UnOpExpr *) {} virtual void visit(const ::aul::ast::BinOpExpr *) {} + virtual void visit(const ::aul::ast::AssignmentExpr *) {} virtual void visit(const ::aul::ast::SubscriptExpr *) {} virtual void visit(const ::aul::ast::SliceExpr *) {} virtual void visit(const ::aul::ast::CallExpr *) {} @@ -224,9 +226,14 @@ public: BinOpExpr(int op, ExprPtr &&lhs, ExprPtr &&rhs) : op(op), lhs(std::move(lhs)), rhs(std::move(rhs)) {} ExprPtr lhs, rhs; int op; // TODO: Make this a proper operator type +}; - // Marker for '=' - enum { AssignmentOp = -1 }; +class AssignmentExpr : public Expr +{ + AST_NODE(AssignmentExpr); +public: + AssignmentExpr(ExprPtr &&lhs, ExprPtr &&rhs) : lhs(std::move(lhs)), rhs(std::move(rhs)) {} + ExprPtr lhs, rhs; }; class SubscriptExpr : public Expr @@ -456,6 +463,11 @@ public: n->lhs->accept(this); n->rhs->accept(this); } + virtual void visit(const ::aul::ast::AssignmentExpr *n) override + { + n->lhs->accept(this); + n->rhs->accept(this); + } virtual void visit(const ::aul::ast::SubscriptExpr *n) override { n->object->accept(this); diff --git a/src/script/C4AulCompiler.cpp b/src/script/C4AulCompiler.cpp index 8bec719c2..5335bd031 100644 --- a/src/script/C4AulCompiler.cpp +++ b/src/script/C4AulCompiler.cpp @@ -228,6 +228,7 @@ public: virtual void visit(const ::aul::ast::VarExpr *n) override; virtual void visit(const ::aul::ast::UnOpExpr *n) override; virtual void visit(const ::aul::ast::BinOpExpr *n) override; + virtual void visit(const ::aul::ast::AssignmentExpr *n) override; virtual void visit(const ::aul::ast::SubscriptExpr *n) override; virtual void visit(const ::aul::ast::SliceExpr *n) override; virtual void visit(const ::aul::ast::CallExpr *n) override; @@ -315,6 +316,7 @@ public: virtual void visit(const ::aul::ast::VarExpr *n) override; virtual void visit(const ::aul::ast::UnOpExpr *n) override; virtual void visit(const ::aul::ast::BinOpExpr *n) override; + virtual void visit(const ::aul::ast::AssignmentExpr *n) override; virtual void visit(const ::aul::ast::SubscriptExpr *n) override; virtual void visit(const ::aul::ast::SliceExpr *n) override; virtual void visit(const ::aul::ast::CallExpr *n) override; @@ -985,14 +987,6 @@ void C4AulCompiler::CodegenAstVisitor::visit(const ::aul::ast::BinOpExpr *n) { n->lhs->accept(this); - if (n->op == ::aul::ast::BinOpExpr::AssignmentOp) - { - C4AulBCC setter = MakeSetter(n->loc, false); - n->rhs->accept(this); - AddBCC(n->loc, setter); - return; - } - const auto &op = C4ScriptOpMap[n->op]; if (op.Code == AB_JUMPAND || op.Code == AB_JUMPOR || op.Code == AB_JUMPNNIL) { @@ -1017,6 +1011,14 @@ void C4AulCompiler::CodegenAstVisitor::visit(const ::aul::ast::BinOpExpr *n) } } +void C4AulCompiler::CodegenAstVisitor::visit(const ::aul::ast::AssignmentExpr *n) +{ + n->lhs->accept(this); + C4AulBCC setter = MakeSetter(n->loc, false); + n->rhs->accept(this); + AddBCC(n->loc, setter); +} + void C4AulCompiler::CodegenAstVisitor::visit(const ::aul::ast::SubscriptExpr *n) { n->object->accept(this); @@ -1588,9 +1590,6 @@ void C4AulCompiler::ConstexprEvaluator::visit(const ::aul::ast::UnOpExpr *n) void C4AulCompiler::ConstexprEvaluator::visit(const ::aul::ast::BinOpExpr *n) { - if (n->op == ::aul::ast::BinOpExpr::AssignmentOp) - nonconst(n); - assert(n->op > 0); const auto &op = C4ScriptOpMap[n->op]; if (op.Changer) @@ -1662,6 +1661,11 @@ void C4AulCompiler::ConstexprEvaluator::visit(const ::aul::ast::BinOpExpr *n) } } +void C4AulCompiler::ConstexprEvaluator::visit(const ::aul::ast::AssignmentExpr *n) +{ + nonconst(n); +} + void C4AulCompiler::ConstexprEvaluator::visit(const ::aul::ast::SubscriptExpr *n) { n->object->accept(this); diff --git a/src/script/C4AulParse.cpp b/src/script/C4AulParse.cpp index 419fcfa5e..503252f4e 100644 --- a/src/script/C4AulParse.cpp +++ b/src/script/C4AulParse.cpp @@ -1460,7 +1460,7 @@ std::unique_ptr<::aul::ast::Expr> C4AulParse::Parse_Expression(int iParentPrio) if (iParentPrio > 1) return expr; Shift(); - expr = ::aul::ast::BinOpExpr::New(NodeStart, ::aul::ast::BinOpExpr::AssignmentOp, std::move(expr), Parse_Expression(1)); + expr = ::aul::ast::AssignmentExpr::New(NodeStart, std::move(expr), Parse_Expression(1)); break; } case ATT_OPERATOR: