aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/declaration.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/include/declaration.hpp')
-rw-r--r--c_compiler/include/declaration.hpp61
1 files changed, 38 insertions, 23 deletions
diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp
index 5c8771b..b91835e 100644
--- a/c_compiler/include/declaration.hpp
+++ b/c_compiler/include/declaration.hpp
@@ -1,5 +1,5 @@
-#ifndef AST_DECLARATION_HPP
-#define AST_DECLARATION_HPP
+#ifndef DECLARATION_HPP
+#define DECLARATION_HPP
#include "node.hpp"
#include "type.hpp"
@@ -8,31 +8,28 @@
#include <memory>
class Declaration;
-
typedef std::shared_ptr<Declaration> DeclarationPtr;
-
class Declaration : public Node {
protected:
- TypePtr type_;
- std::string id_;
- ExpressionPtr initializer_;
DeclarationPtr next_declaration_;
- DeclarationPtr next_list_declaration_;
- bool extern_declaration_;
+ DeclarationPtr next_list_declaration_;
+ ExpressionPtr initializer_;
+ TypePtr type_;
+ bool extern_declaration_;
public:
- Declaration(const std::string &id = "", Expression *initializer = nullptr);
- Declaration(const std::string &id, ExpressionPtr initializer);
-
- virtual void print() const;
- virtual void printXml() const;
- virtual Bindings printAsm(Bindings bindings, int &label_count) const;
- virtual Bindings localAsm(Bindings bindings, int &label_count) const;
- virtual void countDeclarations(int &declaration_count) const;
+ Declaration(Expression *initializer);
+ Declaration(ExpressionPtr initializer);
+
+ virtual void print() const = 0;
+ virtual void printXml() const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
+ virtual Bindings localAsm(Bindings bindings, int &label_count) const = 0;
+ virtual void countDeclarations(int &declaration_count) const = 0;
+ virtual std::string getId() const = 0;
- void linkDeclaration(Declaration *next_declaration);
+ void linkDeclaration(Declaration *next_declaration);
void linkListDeclaration(Declaration *next_list_declaration);
-
void setType(TypePtr type);
void setInitializer(Expression *initializer);
void setExternDeclaration(bool is_extern);
@@ -40,20 +37,38 @@ public:
DeclarationPtr getNext() const;
DeclarationPtr getNextListItem() const;
ExpressionPtr getInitializer() const;
- std::string getId() const;
TypePtr getType() const;
};
+class IdentifierDeclaration : public Declaration {
+private:
+ std::string id_;
+public:
+ IdentifierDeclaration(const std::string &id="", Expression *initializer=nullptr);
+ IdentifierDeclaration(const std::string &id, ExpressionPtr initializer);
+
+ virtual void print() const;
+ virtual void printXml() const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual Bindings localAsm(Bindings bindings, int &label_count) const;
+ virtual void countDeclarations(int &declaration_count) const;
+ virtual std::string getId() const;
+};
+
class ArrayDeclaration : public Declaration
{
private:
int size_;
+ DeclarationPtr declarator_;
public:
- ArrayDeclaration(const std::string &id = "", ExpressionPtr initializer = nullptr, const int &size = 0);
-
+ ArrayDeclaration(Declaration *declarator, ExpressionPtr initializer, const int &size=0);
+
+ virtual void print() const;
+ virtual void printXml() const {}
virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual Bindings localAsm(Bindings bindings, int &label_count) const;
- virtual void countDeclarations(int &declaration_count) const;
+ virtual void countDeclarations(int &declaration_count) const;
+ virtual std::string getId() const;
};
#endif