From f8d552b35e4897b18cc01777bb9725c59a3d5340 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Sat, 25 Mar 2017 00:22:10 +0000 Subject: Arrays working i think --- c_compiler/include/expression.hpp | 8 ++--- c_compiler/src/expression.cpp | 39 ++++++++++++++----------- test_deliverable/testcases/test_ARRAY1.c | 5 ++++ test_deliverable/testcases/test_ARRAY1_driver.c | 6 ++++ 4 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 test_deliverable/testcases/test_ARRAY1.c create mode 100644 test_deliverable/testcases/test_ARRAY1_driver.c diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp index dd3e186..5f50b60 100644 --- a/c_compiler/include/expression.hpp +++ b/c_compiler/include/expression.hpp @@ -56,7 +56,7 @@ class UnaryExpression : public Expression public: virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const = 0; - virtual void stackPosition(VariableStackBindings bindings) const; + virtual void stackPosition(VariableStackBindings bindings, unsigned &depth_count) const; }; class PostfixArrayElement : public UnaryExpression @@ -70,7 +70,7 @@ public: virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; virtual void expressionDepth(unsigned &depth_count) const; - virtual void stackPosition(VariableStackBindings bindings) const; + virtual void stackPosition(VariableStackBindings bindings, unsigned &depth_count) const; }; class PostfixFunctionCall : public UnaryExpression @@ -124,7 +124,7 @@ public: OperatorUnaryExpression(const std::string &_operator, Expression *cast_expression); virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; - virtual void stackPosition(VariableStackBindings bindings) const; + virtual void stackPosition(VariableStackBindings bindings, unsigned &depth_count) const; }; @@ -274,7 +274,7 @@ public: Identifier(const std::string &id); virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; - virtual void stackPosition(VariableStackBindings bindings) const; + virtual void stackPosition(VariableStackBindings bindings, unsigned &depth_count) const; virtual std::string id() const; }; diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index 98afad6..fd78799 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -22,10 +22,9 @@ void Expression::print() const void Expression::printXml() const {} -void Expression::countArguments(unsigned &argument_count) const +void Expression::countArguments(unsigned &) const { // by default don't do anything to the count - (void)argument_count; } void Expression::expressionDepth(unsigned &depth_count) const @@ -112,7 +111,7 @@ void OperationExpression::evaluateExpression(VariableStackBindings bindings, uns // Unary expression definition -void UnaryExpression::stackPosition(VariableStackBindings) const +void UnaryExpression::stackPosition(VariableStackBindings, unsigned &) const { throw std::runtime_error("Error : Cannot get stack position of expression"); } @@ -126,12 +125,21 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, unsigned &label_count) const { + stackPosition(bindings, label_count); + printf("\tlw\t$2,0($t0)\n"); + printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); return bindings; } -void PostfixArrayElement::stackPosition(VariableStackBindings bindings) const +void PostfixArrayElement::stackPosition(VariableStackBindings bindings, unsigned &label_count) const { - + index_expression_->printAsm(bindings, label_count); + + std::shared_ptr unary_expression; + unary_expression = std::static_pointer_cast(postfix_expression_); + unary_expression->stackPosition(bindings, label_count); + + printf("\tli\t$3,4\n\tmul\t$2,$2,$3\n\taddu\t$t0,$t0,$2\n"); } void PostfixArrayElement::expressionDepth(unsigned &depth_count) const @@ -225,7 +233,7 @@ VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBinding unary_expression = std::static_pointer_cast(postfix_expression_); printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); - unary_expression->stackPosition(bindings); + unary_expression->stackPosition(bindings, label_count); printf("\tsw\t$3,0($t0)\n"); return bindings; @@ -252,7 +260,7 @@ VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings b unary_expression = std::static_pointer_cast(unary_expression_); printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); - unary_expression->stackPosition(bindings); + unary_expression->stackPosition(bindings, label_count); printf("\tsw\t$2,0($t0)\n"); return bindings; } @@ -279,7 +287,7 @@ VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bi { std::shared_ptr unary_expression; unary_expression = std::static_pointer_cast(cast_expression_); - unary_expression->stackPosition(bindings); + unary_expression->stackPosition(bindings, label_count); printf("\tmove\t$2,$t0\n"); } else if(operator_ == "-") @@ -296,13 +304,13 @@ VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bi return bindings; } -void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings) const +void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, unsigned &label_count) const { if(operator_ == "*") { std::shared_ptr unary_expression; unary_expression = std::static_pointer_cast(cast_expression_); - unary_expression->stackPosition(bindings); + unary_expression->stackPosition(bindings, label_count); printf("\tlw\t$t0,0($t0)\n"); } } @@ -686,7 +694,7 @@ VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindi printf("\tlw\t$2,%d($fp)\n", expression_stack_position); // we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways - lhs_postfix->stackPosition(bindings); + lhs_postfix->stackPosition(bindings, label_count); printf("\tsw\t$2,0($t0)\n"); return bindings; } @@ -698,10 +706,8 @@ Identifier::Identifier(const std::string &id) : id_(id) {} -VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsigned &label_count) const +VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsigned &) const { - (void)label_count; - if(bindings.bindingExists(id_)) { int stack_position = bindings.stackPosition(id_); @@ -731,7 +737,7 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, unsig return bindings; } -void Identifier::stackPosition(VariableStackBindings bindings) const +void Identifier::stackPosition(VariableStackBindings bindings, unsigned &) const { if(bindings.bindingExists(id_)) { @@ -754,9 +760,8 @@ Constant::Constant(const int32_t &constant) : constant_(constant) {} -VariableStackBindings Constant::printAsm(VariableStackBindings bindings, unsigned &label_count) const +VariableStackBindings Constant::printAsm(VariableStackBindings bindings, unsigned &) const { - (void)label_count; // constant only has to load to $2 because the other expression will take care of the rest printf("\tli\t$2,%d\n", constant_); printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); diff --git a/test_deliverable/testcases/test_ARRAY1.c b/test_deliverable/testcases/test_ARRAY1.c new file mode 100644 index 0000000..347dbdb --- /dev/null +++ b/test_deliverable/testcases/test_ARRAY1.c @@ -0,0 +1,5 @@ +int array1(int a, int b, int c, int d, int e, int f) +{ + int x[5] = { a, b, c, d, e, }; + return x[f]; +} diff --git a/test_deliverable/testcases/test_ARRAY1_driver.c b/test_deliverable/testcases/test_ARRAY1_driver.c new file mode 100644 index 0000000..9bcfc41 --- /dev/null +++ b/test_deliverable/testcases/test_ARRAY1_driver.c @@ -0,0 +1,6 @@ +int array1(int, int, int, int, int, int); + +int main() +{ + return !( 2398 == array1(34, 2344, 2398, 12393, 93, 2) ); +} -- cgit