aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/base.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/include/base.hpp')
-rw-r--r--c_compiler/include/base.hpp130
1 files changed, 126 insertions, 4 deletions
diff --git a/c_compiler/include/base.hpp b/c_compiler/include/base.hpp
index 9451609..ae7cfd7 100644
--- a/c_compiler/include/base.hpp
+++ b/c_compiler/include/base.hpp
@@ -1,16 +1,138 @@
#ifndef AST_BASE_HPP
#define AST_BASE_HPP
-#include <string>
-#include <iostream>
-#include <vector>
+#include "ast.hpp"
+
class Base {
public:
virtual ~Base() {}
virtual void print() const = 0;
- virtual void push(const Base* _var) const = 0;
+ virtual void printxml() const = 0;
+ virtual void printasm() const = 0;
+};
+
+
+class EmptyNode : public Base {
+public:
+ EmptyNode() {}
+
+ virtual void print() const {}
+ virtual void printxml() const {}
+ virtual void printasm() const {}
+};
+
+
+class BaseList : public Base {
+protected:
+ mutable std::vector<const Base*> list;
+
+public:
+ BaseList() {}
+ BaseList(const Base* _var) {
+ push(_var);
+ }
+
+ virtual ~BaseList() {
+ for(auto& var : list) {
+ delete var;
+ }
+ }
+
+ virtual void print() const {
+ for(auto&& declaration : list) {
+ declaration->print();
+ }
+ }
+
+ virtual void printxml() const {
+ for(auto&& declaration : list) {
+ declaration->printxml();
+ }
+ }
+
+ virtual void printasm() const {
+ for(auto&& declaration : list) {
+ declaration->printasm();
+ }
+ }
+
+ virtual void push(const Base* _var) const {
+ list.push_back(_var);
+ }
+};
+
+
+class BaseNode : public Base {
+protected:
+ const Base* leftNode;
+ const Base* rightNode;
+
+public:
+ BaseNode(const Base* _left = new EmptyNode, const Base* _right = new EmptyNode)
+ : leftNode(_left), rightNode(_right) {}
+
+ virtual ~BaseNode() {
+ delete leftNode;
+ delete rightNode;
+ }
+
+ virtual void print() const {
+ leftNode->print();
+ rightNode->print();
+ }
+
+ virtual void printxml() const {
+ leftNode->printxml();
+ rightNode->printxml();
+ }
+
+ virtual void printasm() const {
+ leftNode->printasm();
+ rightNode->printasm();
+ }
+
+ virtual const Base* getLeft() const {
+ return leftNode;
+ }
+
+ virtual const Base* getRight() const {
+ return rightNode;
+ }
+};
+
+
+class BasePrimitive : public Base {
+protected:
+ std::string id;
+ const Base* type;
+
+public:
+ BasePrimitive(const std::string& _id)
+ : id(_id), type(new EmptyNode) {}
+
+ BasePrimitive(const std::string& _id, const Base* _type)
+ : id(_id), type(_type) {}
+
+ virtual ~BasePrimitive() {
+ delete type;
+ }
+
+ virtual void print() const {}
+ virtual void printxml() const {}
+ virtual void printasm() const {}
+};
+
+
+class BaseType : public Base {
+public:
+ BaseType() {}
+
+ virtual void print() const {}
+ virtual void printxml() const {}
+ virtual void printasm() const {}
};
+
#endif