aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/node.hpp
blob: 3390d5bb943d6fc48b555e45906579d0287853bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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