diff options
Diffstat (limited to 'c_compiler/src/expression.cpp')
-rw-r--r-- | c_compiler/src/expression.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index d9a366b..29bfe0d 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -5,12 +5,50 @@ // Expression definition +Expression::~Expression() +{} + void Expression::print() const {} void Expression::printxml() const {} +int32_t Expression::getPostfixStackPosition(VariableStackBindings bindings) const +{ + return -1; +} + + +// OperationExpression definition + +OperationExpression::OperationExpression(Expression* _lhs, Expression* _rhs) + : lhs(_lhs), rhs(_rhs) +{} + +OperationExpression::~OperationExpression() +{ + delete lhs; + delete rhs; +} + + +// Assignment Expression definition + +AssignmentExpression::AssignmentExpression(Expression* _lhs, Expression* _rhs) + : OperationExpression(_lhs, _rhs) +{} + +VariableStackBindings AssignmentExpression::printasm(VariableStackBindings bindings) const +{ + int32_t store_stack_position = lhs->getPostfixStackPosition(bindings); + rhs->printasm(bindings); + + std::cout << "\tsw\t$2," << store_stack_position << "($fp)" << std::endl; + + return bindings; +} + // Identifier definition @@ -30,6 +68,15 @@ VariableStackBindings Identifier::printasm(VariableStackBindings bindings) const return bindings; } +int32_t Identifier::getPostfixStackPosition(VariableStackBindings bindings) const +{ + if(bindings.bindingExists(m_id)) { + return bindings.getStackPosition(m_id); + } + + return -1; +} + // Constant definition |