From b8738b8d582cba01aa1e944426b0251c9c42ff37 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Fri, 24 Mar 2017 22:46:06 +0000 Subject: Able to store arrays --- c_compiler/src/declaration.cpp | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'c_compiler/src/declaration.cpp') diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp index c16c6d5..6edf875 100644 --- a/c_compiler/src/declaration.cpp +++ b/c_compiler/src/declaration.cpp @@ -4,6 +4,7 @@ #include "expression.hpp" #include +#include // Declaration definition @@ -63,13 +64,12 @@ VariableStackBindings Declaration::localAsm(VariableStackBindings bindings, unsi if(id_ != "") { + int stack_position = bindings.currentStackPosition(); if(initializer_ != nullptr) + { initializer_->printAsm(bindings, label_count); - else - printf("\tmove\t$2,$0\n"); - - int stack_position = bindings.currentStackPosition(); - printf("\tsw\t$2,%d($fp)\n", stack_position); + printf("\tsw\t$2,%d($fp)\n", stack_position); + } bindings.insertBinding(id_, type_, stack_position); bindings.increaseStackPosition(); } @@ -155,6 +155,38 @@ VariableStackBindings ArrayDeclaration::printAsm(VariableStackBindings bindings, VariableStackBindings ArrayDeclaration::localAsm(VariableStackBindings bindings, unsigned &label_count) const { + if(next_declaration_ != nullptr) + bindings = next_declaration_->localAsm(bindings, label_count); + + if(next_list_declaration_ != nullptr) + bindings = next_list_declaration_->localAsm(bindings, label_count); + + if(id_ != "") + { + int stack_position = bindings.currentStackPosition(); + if(initializer_ != 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); + printf("\tsw\t$2,%d($fp)\n", stack_position+4*initializer_count); + } + } + + bindings.insertBinding(id_, type_, stack_position); + bindings.increaseStackPosition(size_); + } + return bindings; } -- cgit