diff options
Diffstat (limited to 'c_compiler/src/expression.cpp')
-rw-r--r-- | c_compiler/src/expression.cpp | 86 |
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; |