aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/node.hpp
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-03 21:24:20 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-03 21:24:20 +0000
commitee069912377bf8f5069489e527af642953d5883d (patch)
tree97fa985de635d0b5c82158411b80ac3f7b08a915 /c_compiler/include/node.hpp
parent76de3faca823ce51e32f0e3c4bcc6127492efdc5 (diff)
downloadCompiler-ee069912377bf8f5069489e527af642953d5883d.tar.gz
Compiler-ee069912377bf8f5069489e527af642953d5883d.zip
Going to test
Diffstat (limited to 'c_compiler/include/node.hpp')
-rw-r--r--c_compiler/include/node.hpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/c_compiler/include/node.hpp b/c_compiler/include/node.hpp
new file mode 100644
index 0000000..3390d5b
--- /dev/null
+++ b/c_compiler/include/node.hpp
@@ -0,0 +1,134 @@
+#ifndef AST_BASE_HPP
+#define AST_BASE_HPP
+
+#include "ast.hpp"
+
+
+class Node {
+public:
+ virtual ~Node() {}
+
+ virtual void print() const = 0;
+ virtual void printxml() const = 0;
+ virtual void printasm() const = 0;
+};
+
+
+class EmptyNode : public Node {
+public:
+ EmptyNode() {}
+
+ virtual void print() const {}
+ virtual void printxml() const {}
+ virtual void printasm() const {}
+};
+
+
+class NodeList : public Node {
+protected:
+ mutable std::vector<const Node*> list;
+
+public:
+ NodeList(const Node* _var) {
+ push(_var);
+ }
+
+ virtual ~NodeList() {
+ 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 Node* _var) const {
+ list.push_back(_var);
+ }
+};
+
+
+class NodeNode : public Node {
+protected:
+ const Node* leftNode;
+ const Node* rightNode;
+
+public:
+ NodeNode(const Node* _left = new EmptyNode, const Node* _right = new EmptyNode)
+ : leftNode(_left), rightNode(_right) {}
+
+ virtual ~NodeNode() {
+ 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 Node* getLeft() const {
+ return leftNode;
+ }
+
+ virtual const Node* getRight() const {
+ return rightNode;
+ }
+};
+
+
+class NodePrimitive : public Node {
+protected:
+ std::string id;
+ const Node* type;
+
+public:
+ NodePrimitive(const std::string& _id = "", const Node* _type = new EmptyNode)
+ : id(_id), type(_type) {}
+
+ virtual ~NodePrimitive() {
+ delete type;
+ }
+
+ virtual void print() const {}
+ virtual void printxml() const {}
+ virtual void printasm() const {}
+};
+
+
+class NodeType : public Node {
+public:
+ NodeType() {}
+
+ virtual void print() const {}
+ virtual void printxml() const {}
+ virtual void printasm() const {}
+};
+
+
+#endif