Aul: Split assignment op from standard BinOp

Assignment was special-cased everywhere, so it can just as well get a
separate AST node.
directional-lights
Nicolas Hake 2016-05-13 13:50:29 +02:00
parent daf3424e63
commit 43c6f946dd
3 changed files with 30 additions and 14 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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: