-
Notifications
You must be signed in to change notification settings - Fork 0
/
UPP.java
328 lines (215 loc) · 5.28 KB
/
UPP.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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
// UPP.java
import java.util.*;
/**************************************/
/* Arithmetic and boolean expressions */
/**************************************/
abstract class UPPExpr {}//UPPExpr
class UPPCte extends UPPExpr {
int val;
UPPCte (int val) {
this.val = val;
}//UPPCte
}//UPPCte
class UPPTrue extends UPPExpr {}//UPPTrue
class UPPFalse extends UPPExpr {}//UPPFalse
class UPPVar extends UPPExpr {
String name;
UPPVar (String name) {
this.name = name;
}//UPPVar
}//UPPVar
class UPPGVar extends UPPExpr {
String name;
UPPGVar (String name) {
this.name = name;
}//UPPGVar
}//UPPGVar
abstract class UPPUnOp extends UPPExpr {
UPPExpr e;
}//UPPUnOp
class UPPNot extends UPPUnOp {
UPPNot (UPPExpr e) {
this.e = e;
}//UPPNot
}//UPPNot
abstract class UPPBinOp extends UPPExpr {
UPPExpr e1, e2;
}//UPPBinOp
class UPPAdd extends UPPBinOp {
UPPAdd (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPAdd
}//UPPAdd
class UPPSub extends UPPBinOp {
UPPSub (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPSub
}//UPPSub
class UPPMul extends UPPBinOp {
UPPMul (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPMul
}//UPPMul
class UPPDiv extends UPPBinOp {
UPPDiv (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPDiv
}//UPPDiv
class UPPAnd extends UPPBinOp {
UPPAnd (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPAnd
}//UPPAnd
class UPPOr extends UPPBinOp {
UPPOr (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPOr
}//UPPOr
class UPPLt extends UPPBinOp {
UPPLt (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPLt
}//UPPLt
class UPPLe extends UPPBinOp {
UPPLe (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPLe
}//UPPLe
class UPPEq extends UPPBinOp {
UPPEq (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPEq
}//UPPEq
class UPPNe extends UPPBinOp {
UPPNe (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPNe
}//UPPNe
class UPPGe extends UPPBinOp {
UPPGe (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPGe
}//UPPGe
class UPPGt extends UPPBinOp {
UPPGt (UPPExpr e1, UPPExpr e2) {
this.e1 = e1;
this.e2 = e2;
}//UPPGt
}//UPPGt
class Alloc extends Callee {}//Alloc
class UPPFunCall extends UPPExpr {
Callee callee;
ArrayList<UPPExpr> args;
UPPFunCall (Callee callee, ArrayList<UPPExpr> args) {
this.callee = callee;
this.args = args;
}//FunCall
}//FunCall
class UPPLoad extends UPPExpr {
UPPExpr addr;
UPPLoad (UPPExpr addr) {
this.addr = addr;
}//UPPLoad
}//UPPLoad
/****************/
/* Instructions */
/****************/
abstract class UPPInst {}//UPPInst
class UPPAssign extends UPPInst {
String name;
UPPExpr val;
UPPAssign (String name, UPPExpr val) {
this.name = name;
this.val = val;
}//UPPAssign
}//UPPAssign
class UPPStore extends UPPInst {
UPPExpr addr, val;
UPPStore (UPPExpr addr, UPPExpr val) {
this.addr = addr;
this.val = val;
}//UPPStore
}//UPPStore
class UPPCond extends UPPInst {
UPPExpr cond;
UPPInst i1, i2;
UPPCond (UPPExpr cond, UPPInst i1, UPPInst i2) {
this.cond = cond;
this.i1 = i1;
this.i2 = i2;
}//UPPCond
}//UPPCond
class UPPWhile extends UPPInst {
UPPExpr cond;
UPPInst i;
UPPWhile (UPPExpr cond, UPPInst i) {
this.cond = cond;
this.i = i;
}//UPPWhile
}//UPPWhile
class UPPProcCall extends UPPInst {
Callee callee;
ArrayList<UPPExpr> args;
UPPProcCall (Callee callee, ArrayList<UPPExpr> args) {
this.callee = callee;
this.args = args;
}//UPPProcCall
}//UPPProcCall
class UPPSkip extends UPPInst {}//UPPSkip
class UPPSeq extends UPPInst {
UPPInst i1, i2;
UPPSeq (UPPInst i1, UPPInst i2) {
this.i1 = i1;
this.i2 = i2;
}//UPPSeq
}//UPPSeq
/***************************************/
/* Definitions of functions/procedures */
/***************************************/
abstract class UPPDef {
String name;
ArrayList<String> args, locals;
UPPInst code;
}//UPPDef
class UPPFun extends UPPDef {
UPPFun (String name, ArrayList<String> args, ArrayList<String> locals,
UPPInst code) {
this.name = name;
this.args = args;
this.locals = locals;
this.code = code;
}//UPPFun
}//UPPFun
class UPPProc extends UPPDef {
UPPProc (String name, ArrayList<String> args, ArrayList<String> locals,
UPPInst code) {
this.name = name;
this.args = args;
this.locals = locals;
this.code = code;
}//UPPProc
}//UPPProc
/************/
/* Programs */
/************/
class UPPProg {
ArrayList<String> globals;
ArrayList<UPPDef> defs;
UPPInst code;
UPPProg (ArrayList<String> globals, ArrayList<UPPDef> defs, UPPInst code) {
this.globals = globals;
this.defs = defs;
this.code = code;
}//UPPProg
}//UPPProg