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.cpp50
1 files changed, 49 insertions, 1 deletions
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index b151077..c16c6d5 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -8,10 +8,14 @@
// Declaration definition
-Declaration::Declaration(const std::string& id, Expression* initializer)
+Declaration::Declaration(const std::string &id, Expression *initializer)
: id_(id), initializer_(initializer), extern_declaration_(false)
{}
+Declaration::Declaration(const std::string &id, ExpressionPtr initializer)
+ :id_(id), initializer_(initializer), extern_declaration_(false)
+{}
+
void Declaration::print() const
{
if(next_declaration_ != nullptr)
@@ -73,6 +77,17 @@ VariableStackBindings Declaration::localAsm(VariableStackBindings bindings, unsi
return bindings;
}
+void Declaration::countDeclarations(unsigned &declaration_count) const
+{
+ if(next_declaration_ != nullptr)
+ next_declaration_->countDeclarations(declaration_count);
+
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->countDeclarations(declaration_count);
+
+ ++declaration_count;
+}
+
void Declaration::linkDeclaration(Declaration* next_declaration)
{
DeclarationPtr decl_ptr(next_declaration);
@@ -111,6 +126,11 @@ DeclarationPtr Declaration::getNextListItem() const
return next_list_declaration_;
}
+ExpressionPtr Declaration::getInitializer() const
+{
+ return initializer_;
+}
+
std::string Declaration::getId() const
{
return id_;
@@ -120,3 +140,31 @@ TypePtr Declaration::getType() const
{
return type_;
}
+
+
+// Array declaration class
+
+ArrayDeclaration::ArrayDeclaration(const std::string &id, ExpressionPtr initializer, const unsigned &size)
+ : Declaration(id, initializer), size_(size)
+{}
+
+VariableStackBindings ArrayDeclaration::printAsm(VariableStackBindings bindings, unsigned &label_count) const
+{
+ return bindings;
+}
+
+VariableStackBindings ArrayDeclaration::localAsm(VariableStackBindings bindings, unsigned &label_count) const
+{
+ return bindings;
+}
+
+void ArrayDeclaration::countDeclarations(unsigned &declaration_count) const
+{
+ if(next_declaration_ != nullptr)
+ next_declaration_->countDeclarations(declaration_count);
+
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->countDeclarations(declaration_count);
+
+ declaration_count += size_;
+}