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.cpp46
1 files changed, 45 insertions, 1 deletions
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index 3df0a94..59440ec 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -147,7 +147,32 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express
Bindings PostfixArrayElement::printAsm(Bindings bindings, int &label_count) const
{
- stackPosition(bindings, label_count);
+ std::shared_ptr<PostfixArrayElement> array_element
+ (std::dynamic_pointer_cast<PostfixArrayElement>(postfix_expression_));
+
+ std::vector<int> array_sizes = bindings.getArraySizes(postfix_expression_->id());
+
+ int counter = 1;
+ printf("\tmove\t$t1,$0\n");
+ index_expression_->printAsm(bindings, label_count);
+ printf("\taddu\t$t1,$t1,$2\n");
+ while(array_element != nullptr)
+ {
+ array_element->getIndex()->printAsm(bindings, label_count);
+ int sum = 0;
+ std::for_each(array_sizes.end()-counter, array_sizes.end(), [&] (int n) {
+ sum += n;
+ });
+ printf("\tmul\t$2,$2,%d\n", sum);
+ printf("\taddu\t$t1,$t1,$2\n");
+ array_element = std::dynamic_pointer_cast<PostfixArrayElement>(array_element->getPostfix());
+ counter++;
+ }
+ auto identifier_expression = std::make_shared<Identifier>(postfix_expression_->id());
+ identifier_expression->stackPosition(bindings, label_count);
+ printf("\tsll\t$t1,$t1,%d\n", postfix_expression_->getType(bindings)->getSize()/2);
+ printf("\taddu\t$t0,$t0,$t1\n");
+
TypePtr type_ptr = postfix_expression_->getType(bindings);
std::shared_ptr<Pointer> pointer_type_ptr;
pointer_type_ptr = std::dynamic_pointer_cast<Pointer>(type_ptr);
@@ -185,6 +210,25 @@ TypePtr PostfixArrayElement::getType(const Bindings &bindings) const
return postfix_expression_->getType(bindings);
}
+std::string PostfixArrayElement::id() const
+{
+ return postfix_expression_->id();
+}
+
+ExpressionPtr PostfixArrayElement::getIndex() const
+{
+ if(index_expression_ == nullptr)
+ throw std::runtime_error("Error : No index expression found");
+ return index_expression_;
+}
+
+ExpressionPtr PostfixArrayElement::getPostfix() const
+{
+ if(postfix_expression_ == nullptr)
+ throw std::runtime_error("Error : No index expression postfix");
+ return postfix_expression_;
+}
+
// PostfixFunctionCall