diff options
Diffstat (limited to 'c_compiler/include/declaration.hpp')
-rw-r--r-- | c_compiler/include/declaration.hpp | 61 |
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 |