-
Notifications
You must be signed in to change notification settings - Fork 0
/
AST.java
233 lines (201 loc) · 5.13 KB
/
AST.java
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
//abstract syntax tree for microR
abstract class Program{}
class Statement extends Program{
protected Statement stmt1, stmt2;
public Statement() {}
public Statement (Statement stmt1, Statement stmt2){
this.stmt1 = stmt1;
this.stmt2 = stmt2;
}
public String toString() {
if (stmt1 == null)
return "()";
else if (stmt2 == null)
return "(" + stmt2 + ")";
else
return "(:" + stmt1 + " " + stmt2 + ")";
}
}
class Assignment extends Statement{
protected Identifier lhs;
protected Expression rhs;
public Assignment(){}
public Assignment (Identifier lhs, Expression rhs){
this.lhs = lhs;
this.rhs = rhs;
}
public String toString(){
return "(<- " + lhs + " " + rhs +")";
}
}
class PrintStatement extends Statement{
protected Expression expr;
public PrintStatement (Expression expr){
this.expr = expr;
}
public String toString(){
return "(print " + expr + ")";
}
}
class IfStatement extends Statement{
protected Expression cond;
protected Statement stm1;
protected Statement stm2;
public IfStatement() {}
public IfStatement (Expression cond, Statement stm1, Statement stm2){
this.cond = cond;
this.stm1 = stm1;
this.stm2 = stm2;
}
public String toString(){
return "(if " + cond + " " + stm1 + " " + stm2 + ")";
}
}
class ElseStatement extends Statement{
protected Statement stm;
public ElseStatement(){}
public ElseStatement ( Statement stm){
this.stm = stm;
}
public String toString(){
return "(else " + stm + ")";
}
}
class WhileStatement extends Statement{
protected Expression cond;
protected Statement body;
public WhileStatement(){}
public WhileStatement (Expression cond, Statement body){
this.cond = cond;
this.body = body;
}
public String toString(){
return "(while " + cond +" "+ body +")";
}
}
class ReturnStatement extends Statement{
protected Expression expr;
public ReturnStatement(){}
public ReturnStatement (Expression expr){
this.expr = expr;
}
public String toString(){
return "(return " + expr + ")";
}
}
abstract class Expression{}
class Identifier extends Expression{
protected String id;
public Identifier() {}
public Identifier (String id){
this.id = id;
}
public String toString(){
return "(id " + id + ")";
}
}
class IntValue extends Expression{
protected int intValue;
public IntValue (){}
public IntValue (int intValue){
this.intValue = intValue;
}
public String toString(){
return "(integer " + intValue + ")";
}
}
class ConsExpr extends Expression{
protected Expression expr;
protected Expression expr2;
public ConsExpr(){}
public ConsExpr (Expression expr, Expression expr2){
this.expr = expr;
this.expr2 = expr2;
}
public String toString(){
return "(cons " + expr +" "+ expr2 + ")";
}
}
class HeadExpr extends Expression{
protected Expression expr;
public HeadExpr(){}
public HeadExpr (Expression expr){
this.expr = expr;
}
public String toString(){
return "(head " + expr + ")";
}
}
class TailExpr extends Expression{
protected Expression expr;
public TailExpr(){}
public TailExpr (Expression expr){
this.expr = expr;
}
public String toString(){
return "(tail " + expr + ")";
}
}
class NullExpr extends Expression{
public NullExpr(){}
public String toString(){
return "(null)";
}
}
class AsintExpr extends Expression{
public AsintExpr(){}
public String toString(){
return "(readline)";
}
}
class Binary extends Expression {
protected String op;
protected Expression term1, term2;
public Binary () { }
public Binary (String op, Expression term1, Expression term2) {
this . op = op;
this . term1 = term1;
this . term2 = term2;
}
public String toString () {
return "(" + op + " " + term1 + " " + term2 + ")";
}
}
class Unary extends Expression {
protected String op;
protected Expression term;
public Unary () { }
public Unary (String op, Expression term) {
this . op = op;
this . term = term;
}
public String toString () {
return "(" + op + " " + term + ")";
}
}
class CondExpr extends Expression{
protected Expression term1, term2;
protected String str1, str2;
public CondExpr(){}
public CondExpr (Expression term1, Expression term2, String str1, String str2){
this.term1 = term1;
this.term2 = term2;
this.str1 = str1;
this.str2 = str2;
}
public String toString(){
return "(" + str2 + " "+ str1 + term1 +" " + term2 +")";
}
}
class IDExpr extends Expression{
protected Expression term1,term2,term3;
public IDExpr(){}
public IDExpr(Expression term1, Expression term2, Expression term3){
this.term1 = term1;
this.term2 = term2;
this.term3 = term3;
}
public String toString (){
return "(" +term1 + " "+ term2 + ", " + term3 + ")";
}
}