aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/include')
-rw-r--r--c_compiler/include/ast.hpp6
-rw-r--r--c_compiler/include/declaration.hpp3
-rw-r--r--c_compiler/include/function.hpp6
-rw-r--r--c_compiler/include/statement.hpp18
-rw-r--r--c_compiler/include/type.hpp61
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;
};