aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src/expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/src/expression.cpp')
-rw-r--r--c_compiler/src/expression.cpp47
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