This repository was archived by the owner on Feb 23, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpr_tree.h
More file actions
136 lines (119 loc) · 2.45 KB
/
expr_tree.h
File metadata and controls
136 lines (119 loc) · 2.45 KB
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
135
136
// Definition of ExprTree, its subclasses, and the visitor interface
//
// Created by: David Bell
// April 26th, 2012
#ifndef _EXPR_TREE_HPP_
#define _EXPR_TREE_HPP_
/* Expr Forward Declarations */
class Root;
class Div;
class Minus;
class Plus;
class Times;
class UMinus;
class Ident;
class Int;
/* Visitor Interface for ExprTree */
class Visitor{
public:
virtual ~Visitor() {}
virtual void visitRoot(Root *p) = 0;
virtual void visitDiv(Div *p) = 0;
virtual void visitMinus(Minus *p) = 0;
virtual void visitPlus(Plus *p) = 0;
virtual void visitTimes(Times *p) = 0;
virtual void visitUMinus(UMinus *p) = 0;
virtual void visitIdent(Ident *p) = 0;
virtual void visitInt(Int *p) = 0;
};
class ExprTree
{
public:
ExprTree *parent;
virtual ~ExprTree() {}
virtual void visitSubExpr(Visitor *v) = 0;
virtual void accept(Visitor *v) = 0;
virtual bool isIntExpr() = 0;
virtual int resolveValue() = 0;
};
class Root : public ExprTree {
public:
ExprTree *expr;
Root(ExprTree *e);
~Root();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class Ident : public ExprTree {
public:
char identifier;
Ident(char c);
~Ident();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class Int : public ExprTree {
public:
int value;
Int(int i);
~Int();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class Div : public ExprTree {
public:
ExprTree *op1,*op2;
Div(ExprTree *lhs, ExprTree *rhs);
~Div();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class Times : public ExprTree {
public:
ExprTree *op1,*op2;
Times(ExprTree *lhs, ExprTree *rhs);
~Times();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class Plus : public ExprTree {
public:
ExprTree *op1,*op2;
Plus(ExprTree *lhs, ExprTree *rhs);
~Plus();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class Minus : public ExprTree {
public:
ExprTree *op1,*op2;
Minus(ExprTree *lhs, ExprTree *rhs);
~Minus();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
class UMinus : public ExprTree {
public:
ExprTree *op1;
UMinus(ExprTree *rhs);
~UMinus();
void visitSubExpr(Visitor *v);
void accept(Visitor *v);
bool isIntExpr();
int resolveValue();
};
#endif