From c15bba765558e1017ef68f6d319141d4fb0b71fd Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Tue, 28 Mar 2017 11:16:55 +0100 Subject: can insert mult dim arrays --- c_compiler/src/declaration.cpp | 56 +++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 23 deletions(-) (limited to 'c_compiler/src/declaration.cpp') diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp index ca8f1f5..149bdab 100644 --- a/c_compiler/src/declaration.cpp +++ b/c_compiler/src/declaration.cpp @@ -4,6 +4,7 @@ #include "expression.hpp" #include +#include #include @@ -200,27 +201,21 @@ Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const if(getId() != "") { int stack_position = bindings.currentStackPosition(); - if(initializer_ != nullptr) + std::shared_ptr array_declaration( + std::dynamic_pointer_cast(declarator_)); + std::vector array_sizes = { size_ }; + while(array_declaration != nullptr) { - ExpressionPtr initializer = initializer_; - std::vector initializer_vector; - - while(initializer != nullptr) - { - initializer_vector.push_back(initializer); - initializer = initializer->nextExpression(); - } - - for(auto itr = initializer_vector.rbegin(); itr != initializer_vector.rend(); ++itr) - { - int initializer_count = itr-initializer_vector.rbegin(); - (*itr)->printAsm(bindings, label_count); - type_->store(stack_position+type_->getSize()*initializer_count); - } + array_sizes.push_back(array_declaration->getSize()); + array_declaration = std::dynamic_pointer_cast + (array_declaration->getNextArrayDeclaration()); } - + + std::shared_ptr initializer; + initializer = std::static_pointer_cast(initializer_); + initializer->printInitializerAsm(bindings, label_count, array_sizes.size()-1, array_sizes, type_->type()); + bindings.insertBinding(getId(), type_, stack_position); - type_->increaseStackPosition(bindings); } return bindings; @@ -233,15 +228,30 @@ void ArrayDeclaration::countDeclarations(int &declaration_count) const if(next_list_declaration_ != nullptr) next_list_declaration_->countDeclarations(declaration_count); - std::shared_ptr next_array; - next_array = std::dynamic_pointer_cast(declarator_); - if(next_array != nullptr) - next_array->countDeclarations(declaration_count); + std::shared_ptr array_declaration( + std::dynamic_pointer_cast(declarator_)); + int size = size_; + while(array_declaration != nullptr) + { + size *= array_declaration->getSize(); + array_declaration = std::dynamic_pointer_cast( + array_declaration->getNextArrayDeclaration()); + } - declaration_count += size_; + declaration_count += size; } std::string ArrayDeclaration::getId() const { return declarator_->getId(); } + +int ArrayDeclaration::getSize() const +{ + return size_; +} + +DeclarationPtr ArrayDeclaration::getNextArrayDeclaration() const +{ + return declarator_; +} -- cgit