aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-25 00:22:10 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-25 00:22:10 +0000
commitf8d552b35e4897b18cc01777bb9725c59a3d5340 (patch)
tree73f5ca42d86cce43c152129f772043553d959974
parente027bef26e25af8e3998d06942872bdcb36ee551 (diff)
downloadCompiler-f8d552b35e4897b18cc01777bb9725c59a3d5340.tar.gz
Compiler-f8d552b35e4897b18cc01777bb9725c59a3d5340.zip
Arrays working i think
-rw-r--r--c_compiler/include/expression.hpp8
-rw-r--r--c_compiler/src/expression.cpp39
-rw-r--r--test_deliverable/testcases/test_ARRAY1.c5
-rw-r--r--test_deliverable/testcases/test_ARRAY1_driver.c6
4 files changed, 37 insertions, 21 deletions
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<UnaryExpression> unary_expression;
+ unary_expression = std::static_pointer_cast<UnaryExpression>(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<UnaryExpression>(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<UnaryExpression>(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<UnaryExpression> unary_expression;
unary_expression = std::static_pointer_cast<UnaryExpression>(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<UnaryExpression> unary_expression;
unary_expression = std::static_pointer_cast<UnaryExpression>(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) );
+}