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.cpp86
1 files changed, 45 insertions, 41 deletions
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index dea282f..5e15f42 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -1,5 +1,4 @@
#include "expression.hpp"
-#include "bindings.hpp"
#include <iostream>
@@ -10,14 +9,14 @@ void Expression::print() const
std::cerr << "This expression has not been implemented yet" << std::endl;
}
-void Expression::printxml() const
+void Expression::printXml() const
{
// Does nothing as I do not want it to appear in the xml output
}
-int32_t Expression::getPostfixStackPosition(VariableStackBindings bindings) const
+int Expression::postfixStackPosition(VariableStackBindings bindings) const
{
- std::cerr << "Error: Can't call 'getPostfixStackPosition(VariableStackBindings " <<
+ std::cerr << "Error : Can't call 'getPostfixStackPosition(VariableStackBindings " <<
"bindings)' on this type of expression" << std::endl;
(void)bindings;
return -1;
@@ -26,54 +25,61 @@ int32_t Expression::getPostfixStackPosition(VariableStackBindings bindings) cons
// OperationExpression definition
-OperationExpression::OperationExpression(Expression* _lhs, Expression* _rhs)
- : lhs(_lhs), rhs(_rhs)
+OperationExpression::OperationExpression(Expression* lhs, Expression* rhs)
+ : lhs_(lhs), rhs_(rhs)
{}
// Assignment Expression definition
-AssignmentExpression::AssignmentExpression(Expression* _lhs, Expression* _rhs)
- : OperationExpression(_lhs, _rhs)
+AssignmentExpression::AssignmentExpression(Expression* lhs, Expression* rhs)
+ : OperationExpression(lhs, rhs)
{}
-VariableStackBindings AssignmentExpression::printasm(VariableStackBindings bindings) const
+VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings) const
{
+ // TODO
// the lhs is forced to have a stack position due to it being a function, array or other type of variable
- int32_t store_stack_position = lhs->getPostfixStackPosition(bindings);
- rhs->printasm(bindings);
+ /*unsigned current_stack = bindings.currentRegister();
+ // std::cout << "Current Register: " << current_reg << std::endl;
+ bindings.increaseRegister();
+
+ int store_stack_position = lhs->getPostfixStackPosition(bindings);
+
+ rhs->printAsm(bindings);
// we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways
- std::cout << "\tsw\t$2," << store_stack_position << "($fp)" << std::endl;
+ std::cout << "\tsw\t$" << current_reg << "," << store_stack_position
+ << "($fp)" << std::endl; */
return bindings;
}
// Additive Expression definition
-AdditiveExpression::AdditiveExpression(Expression* _lhs, const std::string& _operation, Expression* _rhs)
- : OperationExpression(_lhs, _rhs), operation(_operation)
+AdditiveExpression::AdditiveExpression(Expression* lhs, const std::string& operation, Expression* rhs)
+ : OperationExpression(lhs, rhs), operation_(operation)
{}
-VariableStackBindings AdditiveExpression::printasm(VariableStackBindings bindings) const
+VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings) const
{
- lhs->printasm(bindings);
+ lhs_->printAsm(bindings);
// move the rhs out of the way to be able to evaluate the lhs
std::cout << "\tmove\t$3,$2" << std::endl;
- rhs->printasm(bindings);
+ rhs_->printAsm(bindings);
// then perform the right operation
// currently using signed and sub because I only have signed numbers implemented
// must update this as I add more types
- if(operation == "+")
+ if(operation_ == "+")
std::cout << "\tadd\t$2,$3,$2" << std::endl;
- else if(operation == "-")
+ else if(operation_ == "-")
std::cout << "\tsub\t$2,$3,$2" << std::endl;
else
- std::cerr << "Don't recognize symbol: '" << operation << "'" << std::endl;
+ std::cerr << "Don't recognize symbol: '" << operation_ << "'" << std::endl;
return bindings;
}
@@ -82,29 +88,29 @@ VariableStackBindings AdditiveExpression::printasm(VariableStackBindings binding
// Multiplicative Expression definition
-MultiplicativeExpression::MultiplicativeExpression(Expression* _lhs, const std::string& _operation, Expression* _rhs)
- : OperationExpression(_lhs, _rhs), operation(_operation)
+MultiplicativeExpression::MultiplicativeExpression(Expression* lhs, const std::string& operation, Expression* rhs)
+ : OperationExpression(lhs, rhs), operation_(operation)
{}
-VariableStackBindings MultiplicativeExpression::printasm(VariableStackBindings bindings) const
+VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings) const
{
- lhs->printasm(bindings);
+ lhs_->printAsm(bindings);
std::cout << "\tmove\t$3,$2" << std::endl;
- rhs->printasm(bindings);
+ rhs_->printAsm(bindings);
// then perform the right operation
- if(operation == "*")
+ if(operation_ == "*")
std::cout << "\tmul\t$2,$3,$2" << std::endl;
- else if(operation == "/" || operation == "%") {
+ else if(operation_ == "/" || operation_ == "%") {
std::cout << "\tdiv\t$3,$2" << std::endl;
- if(operation == "/")
+ if(operation_ == "/")
std::cout << "\tmflo\t$2" << std::endl;
else
std::cout << "\tmfhi\t$2" << std::endl;
} else
- std::cerr << "Don't recognize symbol '" << operation << "'" << std::endl;
+ std::cerr << "Don't recognize symbol '" << operation_ << "'" << std::endl;
return bindings;
}
@@ -113,25 +119,23 @@ VariableStackBindings MultiplicativeExpression::printasm(VariableStackBindings b
// Identifier definition
Identifier::Identifier(const std::string& id)
- : m_id(id)
+ : id_(id)
{}
-VariableStackBindings Identifier::printasm(VariableStackBindings bindings) const
+VariableStackBindings Identifier::printAsm(VariableStackBindings bindings) const
{
- if(bindings.bindingExists(m_id)) {
- int32_t stack_position = bindings.getStackPosition(m_id);
-
- std::cout << "\tlw\t$2," << stack_position << "($fp)" << std::endl;
- } else
- std::cerr << "Can't find identifier '" << m_id << "' in current scope binding" << std::endl;
+ if(bindings.bindingExists(id_))
+ std::cout << "\tlw\t$2," << bindings.stackPosition(id_) << "($fp)" << std::endl;
+ else
+ std::cerr << "Can't find identifier '" << id_ << "' in current scope binding" << std::endl;
return bindings;
}
-int32_t Identifier::getPostfixStackPosition(VariableStackBindings bindings) const
+int Identifier::postfixStackPosition(VariableStackBindings bindings) const
{
- if(bindings.bindingExists(m_id)) {
- return bindings.getStackPosition(m_id);
+ if(bindings.bindingExists(id_)) {
+ return bindings.stackPosition(id_);
}
return -1;
@@ -144,7 +148,7 @@ Constant::Constant(const int32_t& constant)
: m_constant(constant)
{}
-VariableStackBindings Constant::printasm(VariableStackBindings bindings) const
+VariableStackBindings Constant::printAsm(VariableStackBindings bindings) const
{
// constant only has to load to $2 because the other expression will take care of the rest
std::cout << "\tli\t$2," << m_constant << std::endl;