diff options
Diffstat (limited to 'c_compiler/src/declaration.cpp')
-rw-r--r-- | c_compiler/src/declaration.cpp | 147 |
1 files changed, 84 insertions, 63 deletions
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp index 594c91b..9f672db 100644 --- a/c_compiler/src/declaration.cpp +++ b/c_compiler/src/declaration.cpp @@ -9,15 +9,74 @@ // Declaration definition -Declaration::Declaration(const std::string &id, Expression *initializer) - : id_(id), initializer_(initializer), extern_declaration_(false) +Declaration::Declaration(Expression *initializer) + : initializer_(initializer), extern_declaration_(false) {} -Declaration::Declaration(const std::string &id, ExpressionPtr initializer) - :id_(id), initializer_(initializer), extern_declaration_(false) +Declaration::Declaration(ExpressionPtr initializer) + : initializer_(initializer), extern_declaration_(false) {} -void Declaration::print() const +void Declaration::linkDeclaration(Declaration* next_declaration) +{ + DeclarationPtr decl_ptr(next_declaration); + next_declaration_ = decl_ptr; +} + +void Declaration::linkListDeclaration(Declaration* next_declaration) +{ + DeclarationPtr decl_ptr(next_declaration); + next_list_declaration_ = decl_ptr; +} + +void Declaration::setType(TypePtr type) +{ + type_ = type; +} + +void Declaration::setInitializer(Expression* initializer) +{ + ExpressionPtr expression_ptr(initializer); + initializer_ = expression_ptr; +} + +void Declaration::setExternDeclaration(bool is_extern) +{ + extern_declaration_ = is_extern; +} + +DeclarationPtr Declaration::getNext() const +{ + return next_declaration_; +} + +DeclarationPtr Declaration::getNextListItem() const +{ + return next_list_declaration_; +} + +ExpressionPtr Declaration::getInitializer() const +{ + return initializer_; +} + +TypePtr Declaration::getType() const +{ + return type_; +} + + +// IdentifierDeclaration definition + +IdentifierDeclaration::IdentifierDeclaration(const std::string &id, Expression *initializer) + : Declaration(initializer), id_(id) +{} + +IdentifierDeclaration::IdentifierDeclaration(const std::string &id, ExpressionPtr initializer) + : Declaration(initializer), id_(id) +{} + +void IdentifierDeclaration::print() const { if(next_declaration_ != nullptr) next_declaration_->print(); @@ -26,7 +85,7 @@ void Declaration::print() const printf("%s\n", id_.c_str()); } -void Declaration::printXml() const +void IdentifierDeclaration::printXml() const { if(next_declaration_ != nullptr) next_declaration_->printXml(); @@ -38,7 +97,7 @@ void Declaration::printXml() const printf("<Variable id=\"%s\" />", id_.c_str()); } -Bindings Declaration::printAsm(Bindings bindings, int& label_count) const +Bindings IdentifierDeclaration::printAsm(Bindings bindings, int& label_count) const { (void)label_count; if(!extern_declaration_) @@ -54,7 +113,7 @@ Bindings Declaration::printAsm(Bindings bindings, int& label_count) const return bindings; } -Bindings Declaration::localAsm(Bindings bindings, int& label_count) const +Bindings IdentifierDeclaration::localAsm(Bindings bindings, int& label_count) const { if(next_declaration_ != nullptr) bindings = next_declaration_->localAsm(bindings, label_count); @@ -77,7 +136,7 @@ Bindings Declaration::localAsm(Bindings bindings, int& label_count) const return bindings; } -void Declaration::countDeclarations(int &declaration_count) const +void IdentifierDeclaration::countDeclarations(int &declaration_count) const { if(next_declaration_ != nullptr) next_declaration_->countDeclarations(declaration_count); @@ -88,67 +147,24 @@ void Declaration::countDeclarations(int &declaration_count) const ++declaration_count; } -void Declaration::linkDeclaration(Declaration* next_declaration) -{ - DeclarationPtr decl_ptr(next_declaration); - next_declaration_ = decl_ptr; -} - -void Declaration::linkListDeclaration(Declaration* next_declaration) -{ - DeclarationPtr decl_ptr(next_declaration); - next_list_declaration_ = decl_ptr; -} - -void Declaration::setType(TypePtr type) -{ - type_ = type; -} - -void Declaration::setInitializer(Expression* initializer) -{ - ExpressionPtr expression_ptr(initializer); - initializer_ = expression_ptr; -} - -void Declaration::setExternDeclaration(bool is_extern) -{ - extern_declaration_ = is_extern; -} - -DeclarationPtr Declaration::getNext() const -{ - return next_declaration_; -} - -DeclarationPtr Declaration::getNextListItem() const -{ - return next_list_declaration_; -} - -ExpressionPtr Declaration::getInitializer() const -{ - return initializer_; -} - -std::string Declaration::getId() const +std::string IdentifierDeclaration::getId() const { return id_; } -TypePtr Declaration::getType() const -{ - return type_; -} - // Array declaration class -ArrayDeclaration::ArrayDeclaration(const std::string &id, ExpressionPtr initializer, const int &size) - : Declaration(id, initializer), size_(size) +ArrayDeclaration::ArrayDeclaration(Declaration *declarator, ExpressionPtr initializer, const int &size) + : Declaration(initializer), size_(size), declarator_(declarator) {} -Bindings ArrayDeclaration::printAsm(Bindings bindings, int &label_count) const +void ArrayDeclaration::print() const +{ + printf("Array Declaration\n"); +} + +Bindings ArrayDeclaration::printAsm(Bindings bindings, int &) const { return bindings; } @@ -161,7 +177,7 @@ Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const if(next_list_declaration_ != nullptr) bindings = next_list_declaration_->localAsm(bindings, label_count); - if(id_ != "") + if(getId() != "") { int stack_position = bindings.currentStackPosition(); if(initializer_ != nullptr) @@ -183,7 +199,7 @@ Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const } } - bindings.insertBinding(id_, type_, stack_position); + bindings.insertBinding(getId(), type_, stack_position); type_->increaseStackPosition(bindings); } @@ -200,3 +216,8 @@ void ArrayDeclaration::countDeclarations(int &declaration_count) const declaration_count += size_; } + +std::string ArrayDeclaration::getId() const +{ + return declarator_->getId(); +} |