aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src/declaration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/src/declaration.cpp')
-rw-r--r--c_compiler/src/declaration.cpp147
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();
+}