diff options
Diffstat (limited to 'c_compiler/include')
-rw-r--r-- | c_compiler/include/ast.hpp | 6 | ||||
-rw-r--r-- | c_compiler/include/declaration.hpp | 3 | ||||
-rw-r--r-- | c_compiler/include/function.hpp | 6 | ||||
-rw-r--r-- | c_compiler/include/statement.hpp | 18 | ||||
-rw-r--r-- | c_compiler/include/type.hpp | 61 |
5 files changed, 86 insertions, 8 deletions
diff --git a/c_compiler/include/ast.hpp b/c_compiler/include/ast.hpp index 86c9934..cea7e82 100644 --- a/c_compiler/include/ast.hpp +++ b/c_compiler/include/ast.hpp @@ -4,6 +4,12 @@ #include <vector> #include <string> #include <iostream> +#include <map> +#include <cstdint> + +struct VarLocation; + +typedef std::map<std::string, VarLocation> VariableStack; #include "node.hpp" #include "expression.hpp" diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp index 141d4d0..9287827 100644 --- a/c_compiler/include/declaration.hpp +++ b/c_compiler/include/declaration.hpp @@ -11,7 +11,7 @@ protected: std::string id; Initializer* init; Declaration* next_decl; - Declaration* decl_list; + Declaration* list_next_decl; public: Declaration(const std::string& _id = ""); @@ -24,6 +24,7 @@ public: void addList(Declaration* _next_decl); Declaration* getNext() const; + Declaration* getNextListItem() const; std::string getId() const; }; diff --git a/c_compiler/include/function.hpp b/c_compiler/include/function.hpp index edfb958..967c9d8 100644 --- a/c_compiler/include/function.hpp +++ b/c_compiler/include/function.hpp @@ -4,6 +4,12 @@ #include "ast.hpp" +struct VarLocation { + Type* type; + int32_t stack_position; +}; + + class Function : public Node { protected: Type* type; diff --git a/c_compiler/include/statement.hpp b/c_compiler/include/statement.hpp index dff9902..17a5153 100644 --- a/c_compiler/include/statement.hpp +++ b/c_compiler/include/statement.hpp @@ -7,6 +7,7 @@ class Statement : public Node { protected: Statement* next_statement; + public: Statement(Statement* statement = nullptr); @@ -14,9 +15,9 @@ public: virtual void printxml() const = 0; virtual void printasm() const = 0; - void addStatement(Statement* _next) { - next_statement = _next; - } + virtual void count_variables(int32_t& var_count) const = 0; + + void addStatement(Statement* _next); }; @@ -24,6 +25,7 @@ class CompoundStatement : public Statement { protected: Declaration* m_decl; Statement* m_statement; + public: CompoundStatement(Declaration* decl = nullptr, Statement* statement = nullptr); CompoundStatement(Statement* statement); @@ -31,6 +33,8 @@ public: virtual void print() const; virtual void printxml() const; virtual void printasm() const; + + virtual void count_variables(int32_t& var_count) const; }; @@ -44,6 +48,8 @@ public: virtual void print() const; virtual void printxml() const; virtual void printasm() const; + + virtual void count_variables(int32_t& var_count) const; }; @@ -56,6 +62,8 @@ public: virtual void print() const; virtual void printxml() const; virtual void printasm() const; + + virtual void count_variables(int32_t& var_count) const; }; @@ -68,6 +76,8 @@ public: virtual void print() const; virtual void printxml() const; virtual void printasm() const; + + virtual void count_variables(int32_t& var_count) const; }; @@ -80,6 +90,8 @@ public: virtual void print() const; virtual void printxml() const; virtual void printasm() const; + + virtual void count_variables(int32_t& var_count) const; }; diff --git a/c_compiler/include/type.hpp b/c_compiler/include/type.hpp index 6e8eefa..415f00f 100644 --- a/c_compiler/include/type.hpp +++ b/c_compiler/include/type.hpp @@ -6,11 +6,64 @@ class Type : public Node { public: - Type(); + virtual void print() const; + virtual void printxml() const; + virtual void printasm() const; - virtual void print() const {} - virtual void printxml() const {} - virtual void printasm() const {} + virtual std::string getType() const = 0; +}; + + +class Specifier : Type { +public: + virtual std::string getType() const = 0; +}; + + +class Pointer : Type { +protected: + Type* pointer_type; + +public: + Pointer(Type* _pointer_type); + + virtual std::string getType() const; +}; + + +class Array : Type { +protected: + int32_t size; + Type* array_type; + +public: + Array(Type* _array_type, int32_t _size = 0); + + virtual std::string getType() const; +}; + + +class Void : Specifier { +public: + Void(); + + virtual std::string getType() const; +}; + + +class Int : Specifier { +public: + Int(); + + virtual std::string getType() const; +}; + + +class Char : Specifier { +public: + Char(); + + virtual std::string getType() const; }; |