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.cpp260
1 files changed, 130 insertions, 130 deletions
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index 7c7791e..9918294 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -12,261 +12,261 @@
// Declaration definition
Declaration::Declaration(Expression *initializer)
- : initializer_(initializer), extern_declaration_(false)
+ : initializer_(initializer), extern_declaration_(false)
{}
Declaration::Declaration(ExpressionPtr initializer)
- : initializer_(initializer), extern_declaration_(false)
+ : initializer_(initializer), extern_declaration_(false)
{}
void Declaration::linkDeclaration(Declaration* next_declaration)
{
- DeclarationPtr decl_ptr(next_declaration);
- next_declaration_ = decl_ptr;
+ 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;
+ DeclarationPtr decl_ptr(next_declaration);
+ next_list_declaration_ = decl_ptr;
}
void Declaration::setType(TypePtr type)
{
- type_ = type;
+ type_ = type;
}
void Declaration::setInitializer(Expression* initializer)
{
- ExpressionPtr expression_ptr(initializer);
- initializer_ = expression_ptr;
+ ExpressionPtr expression_ptr(initializer);
+ initializer_ = expression_ptr;
}
void Declaration::setExternDeclaration(bool is_extern)
{
- extern_declaration_ = is_extern;
+ extern_declaration_ = is_extern;
}
DeclarationPtr Declaration::getNext() const
{
- return next_declaration_;
+ return next_declaration_;
}
DeclarationPtr Declaration::getNextListItem() const
{
- return next_list_declaration_;
+ return next_list_declaration_;
}
ExpressionPtr Declaration::getInitializer() const
{
- return initializer_;
+ return initializer_;
}
TypePtr Declaration::getType() const
{
- return type_;
+ return type_;
}
// IdentifierDeclaration definition
IdentifierDeclaration::IdentifierDeclaration(const std::string &id, Expression *initializer)
- : Declaration(initializer), id_(id)
+ : Declaration(initializer), id_(id)
{}
IdentifierDeclaration::IdentifierDeclaration(const std::string &id, ExpressionPtr initializer)
- : Declaration(initializer), id_(id)
+ : Declaration(initializer), id_(id)
{}
void IdentifierDeclaration::print() const
{
- if(next_declaration_ != nullptr)
- next_declaration_->print();
+ if(next_declaration_ != nullptr)
+ next_declaration_->print();
- if(id_ != "")
- printf("%s\n", id_.c_str());
+ if(id_ != "")
+ printf("%s\n", id_.c_str());
}
void IdentifierDeclaration::printXml() const
{
- if(next_declaration_ != nullptr)
- next_declaration_->printXml();
+ if(next_declaration_ != nullptr)
+ next_declaration_->printXml();
- if(next_list_declaration_ != nullptr)
- next_list_declaration_->printXml();
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->printXml();
- if(id_ != "")
- printf("<Variable id=\"%s\" />", id_.c_str());
+ if(id_ != "")
+ printf("<Variable id=\"%s\" />", id_.c_str());
}
Bindings IdentifierDeclaration::printAsm(Bindings bindings, int& label_count) const
{
- (void)label_count;
- if(!extern_declaration_)
- {
- if(initializer_ == nullptr)
- printf("\t.comm\t%s,4,4\n", id_.c_str());
- else
- printf("\t.data\n\t.globl\t%s\n%s:\n\t.word\t%d\n",
- id_.c_str(), id_.c_str(), initializer_->constantFold());
- }
+ (void)label_count;
+ if(!extern_declaration_)
+ {
+ if(initializer_ == nullptr)
+ printf("\t.comm\t%s,4,4\n", id_.c_str());
+ else
+ printf("\t.data\n\t.globl\t%s\n%s:\n\t.word\t%d\n",
+ id_.c_str(), id_.c_str(), initializer_->constantFold());
+ }
- bindings.insertBinding(id_, type_, -1);
- return bindings;
+ bindings.insertBinding(id_, type_, -1);
+ return bindings;
}
Bindings IdentifierDeclaration::localAsm(Bindings bindings, int& label_count) const
{
- if(next_declaration_ != nullptr)
- bindings = next_declaration_->localAsm(bindings, label_count);
+ 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(next_list_declaration_ != nullptr)
+ bindings = next_list_declaration_->localAsm(bindings, label_count);
- if(id_ != "")
- {
- int stack_position = bindings.currentStackPosition();
- if(initializer_ != nullptr)
+ if(id_ != "")
{
- initializer_->printAsm(bindings, label_count);
- type_->store(stack_position);
+ int stack_position = bindings.currentStackPosition();
+ if(initializer_ != nullptr)
+ {
+ initializer_->printAsm(bindings, label_count);
+ type_->store(stack_position);
+ }
+ bindings.insertBinding(id_, type_, stack_position);
+ type_->increaseStackPosition(bindings);
}
- bindings.insertBinding(id_, type_, stack_position);
- type_->increaseStackPosition(bindings);
- }
- return bindings;
+ return bindings;
}
void IdentifierDeclaration::countDeclarations(int &declaration_count) const
{
- if(next_declaration_ != nullptr)
- next_declaration_->countDeclarations(declaration_count);
+ if(next_declaration_ != nullptr)
+ next_declaration_->countDeclarations(declaration_count);
- if(next_list_declaration_ != nullptr)
- next_list_declaration_->countDeclarations(declaration_count);
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->countDeclarations(declaration_count);
- ++declaration_count;
+ ++declaration_count;
}
std::string IdentifierDeclaration::getId() const
{
- return id_;
+ return id_;
}
// Array declaration class
ArrayDeclaration::ArrayDeclaration(Declaration *declarator, ExpressionPtr initializer, const int &size)
- : Declaration(initializer), size_(size), declarator_(declarator)
+ : Declaration(initializer), size_(size), declarator_(declarator)
{}
void ArrayDeclaration::print() const
{
- if(next_declaration_ != nullptr)
- next_declaration_->print();
- if(next_list_declaration_ != nullptr)
- next_list_declaration_->print();
+ if(next_declaration_ != nullptr)
+ next_declaration_->print();
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->print();
- printf("Array Declaration\n");
- declarator_->print();
+ printf("Array Declaration\n");
+ declarator_->print();
}
void ArrayDeclaration::printXml() const
{
- if(next_declaration_ != nullptr)
- next_declaration_->printXml();
- if(next_list_declaration_ != nullptr)
- next_list_declaration_->printXml();
- declarator_->printXml();
+ if(next_declaration_ != nullptr)
+ next_declaration_->printXml();
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->printXml();
+ declarator_->printXml();
}
Bindings ArrayDeclaration::printAsm(Bindings bindings, int &label_count) const
{
- if(next_declaration_ != nullptr)
- bindings = next_declaration_->printAsm(bindings, label_count);
- if(next_list_declaration_ != nullptr)
- bindings = next_list_declaration_->printAsm(bindings, label_count);
- bindings = declarator_->printAsm(bindings, label_count);
+ if(next_declaration_ != nullptr)
+ bindings = next_declaration_->printAsm(bindings, label_count);
+ if(next_list_declaration_ != nullptr)
+ bindings = next_list_declaration_->printAsm(bindings, label_count);
+ bindings = declarator_->printAsm(bindings, label_count);
- return bindings;
+ return bindings;
}
Bindings ArrayDeclaration::localAsm(Bindings bindings, int &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(next_declaration_ != nullptr)
+ bindings = next_declaration_->localAsm(bindings, label_count);
+ if(next_list_declaration_ != nullptr)
+ bindings = next_list_declaration_->localAsm(bindings, label_count);
- if(getId() != "")
- {
-
- int stack_position = bindings.currentStackPosition();
- std::shared_ptr<ArrayDeclaration> array_declaration(
- std::dynamic_pointer_cast<ArrayDeclaration>(declarator_));
- std::vector<int> array_sizes = { size_ };
- while(array_declaration != nullptr)
+ if(getId() != "")
{
- array_sizes.push_back(array_declaration->getSize());
- array_declaration = std::dynamic_pointer_cast<ArrayDeclaration>
- (array_declaration->getNextArrayDeclaration());
- }
-
- std::shared_ptr<Initializer> initializer;
- if(initializer_ != nullptr)
- {
- initializer = std::static_pointer_cast<Initializer>(initializer_);
- initializer->printInitializerAsm(bindings, label_count, array_sizes.size()-1, array_sizes, type_->type());
- }
- else
- {
- int sum = 1;
- std::for_each(array_sizes.begin(), array_sizes.end(), [&] (int n) {
- sum *= n;
- });
- sum *= getType()->getSize();
- bindings.increaseStackPosition(sum);
+
+ int stack_position = bindings.currentStackPosition();
+ std::shared_ptr<ArrayDeclaration> array_declaration(
+ std::dynamic_pointer_cast<ArrayDeclaration>(declarator_));
+ std::vector<int> array_sizes = { size_ };
+ while(array_declaration != nullptr)
+ {
+ array_sizes.push_back(array_declaration->getSize());
+ array_declaration = std::dynamic_pointer_cast<ArrayDeclaration>
+ (array_declaration->getNextArrayDeclaration());
+ }
+
+ std::shared_ptr<Initializer> initializer;
+ if(initializer_ != nullptr)
+ {
+ initializer = std::static_pointer_cast<Initializer>(initializer_);
+ initializer->printInitializerAsm(bindings, label_count, array_sizes.size()-1, array_sizes, type_->type());
+ }
+ else
+ {
+ int sum = 1;
+ std::for_each(array_sizes.begin(), array_sizes.end(), [&] (int n) {
+ sum *= n;
+ });
+ sum *= getType()->getSize();
+ bindings.increaseStackPosition(sum);
+ }
+ // reverse vector to store in binding
+ std::reverse(array_sizes.begin(), array_sizes.end());
+ bindings.insertBinding(getId(), type_, stack_position, array_sizes);
}
- // reverse vector to store in binding
- std::reverse(array_sizes.begin(), array_sizes.end());
- bindings.insertBinding(getId(), type_, stack_position, array_sizes);
- }
- return bindings;
+ return bindings;
}
void ArrayDeclaration::countDeclarations(int &declaration_count) const
{
- if(next_declaration_ != nullptr)
- next_declaration_->countDeclarations(declaration_count);
- if(next_list_declaration_ != nullptr)
- next_list_declaration_->countDeclarations(declaration_count);
-
- std::shared_ptr<ArrayDeclaration> array_declaration(
- std::dynamic_pointer_cast<ArrayDeclaration>(declarator_));
- int size = size_;
- while(array_declaration != nullptr)
- {
- size *= array_declaration->getSize();
- array_declaration = std::dynamic_pointer_cast<ArrayDeclaration>(
- array_declaration->getNextArrayDeclaration());
- }
-
- declaration_count += size;
+ if(next_declaration_ != nullptr)
+ next_declaration_->countDeclarations(declaration_count);
+ if(next_list_declaration_ != nullptr)
+ next_list_declaration_->countDeclarations(declaration_count);
+
+ std::shared_ptr<ArrayDeclaration> array_declaration(
+ std::dynamic_pointer_cast<ArrayDeclaration>(declarator_));
+ int size = size_;
+ while(array_declaration != nullptr)
+ {
+ size *= array_declaration->getSize();
+ array_declaration = std::dynamic_pointer_cast<ArrayDeclaration>(
+ array_declaration->getNextArrayDeclaration());
+ }
+
+ declaration_count += size;
}
std::string ArrayDeclaration::getId() const
{
- return declarator_->getId();
+ return declarator_->getId();
}
int ArrayDeclaration::getSize() const
{
- return size_;
+ return size_;
}
DeclarationPtr ArrayDeclaration::getNextArrayDeclaration() const
{
- return declarator_;
+ return declarator_;
}