-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpseudocode.txt
407 lines (406 loc) · 10.2 KB
/
pseudocode.txt
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
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
code
codeidx
table
tableidx
list
listidx
level
registercounter
parse
set up global variables
registercounter = -1
emit JMP (7, 0, 0, M = 0)
addtosymboltable(3, "main", 0, 0, 0, 0)
level = -1
block()
check for error 1
emit HLT (11, 0, 0, 0)
code[0].m = table[0].addr
for i = 0, i < codeidx, i++
if code[i].opcode == 5
code[i].m = table[code[i].m].addr
print table and or code
return code
block
level++
procedureidx = tableidx - 1
x = var-declaration()
procedure-declaration()
table[procedureidx].addr = codeidx
emit INC (6, 0, 0, M = x)
statement()
mark()
level--
var-declaration
memorysize = 3
symbolname
arraysize
if list[listidx] is varsym
do
listidx++
if list[listidx] is not identsym
error 2
if multipledeclarationcheck(list[listidx].name) != -1
error 3
symbolname = list[listidx].name
listidx++
if list[listidx] is lbracketsym
listidx++
if list[listidx] is not numbersym || list[listidx].value == 0
error 4
arraysize = list[listidx].value
listidx++
if list[listidx] is multsym, divsym, modsym, addsym, subsym
error 4
else if list[listidx] is not rbracket
error 5
listidx++
addtosymboltable(2, symbolname, arraysize, level, memorysize, 0)
memorysize += arraysize
else
addtosymboltable(1, symbolname, 0, level, memorysize, 0)
memorysize++
while list[listidx] is commasym
if list[listidx] is identsym
error 6
else if list[listidx] is not semicolonsym
error 7
listidx++
return memorysize
else
return memorysize
procedure-declaration
symbolname
while list[listidx] is proceduresym
listidx++
if list[listidx] is not identsym
error 2
else if multipledeclarationcheck(list[listidx].name) != -1
error 3
symbolname = list[listidx].name
listidx++
if list[listidx] is not semicolonsym
error 8
listidx++
addtosymboltable(3, symbolname, 0, level, 0, 0)
block()
if list[listidx] is not semicolonsym
error 7
listidx++
emit RET (2, 0, 0, 0)
statement
symbolname
symidx
arrayidxreg
varlocreg
jpcidx
jmpidx
loopidx
assignment
symbolname = list[listidx].name
listidx++
if list[listidx] is lbracketsym
listidx++
symidx = findsymbol(symbolname, 2)
if symidx == -1
if findsymbol(symbolname, 1) != -1
error 11
else if findsymbol(symbolname, 3) != -1
error 9
else
error 10
expression()
arrayidxreg = registercounter
if list[listidx] is not rbracketsym
error 5
listidx++
if list[listidx] is not assignsym
error 13
listidx++
expression()
registercounter++
if registercounter >= 10
error 14
emit LIT (1, R = registercounter, 0, M = table[symidx].addr)
emit ADD (13, R = arrayidxreg, L = arrayidxreg, registercounter)
registercounter--
emit STO (4, R = registercounter, L = level - table[symidx].level, M = arrayidxreg)
registercounter -= 2
else
symidx = findsymbol(symbolname, 1)
if symidx == -1
if findsymbol(symbolname, 2) != -1
error 12
else if findsymbol(symbolname, 3) != -1
error 9
else
error 10
registercounter++
if registercounter >= 10
error 14
emit LIT(1, R = registercounter, 0, M = table[symidx].addr)
varlocreg = registercounter
if list[listidx] is not assignsym
error 13
listidx++
expression()
emit STO (4, R = registercounter, L = level - table[symidx].level, M = varlocreg)
registercounter -= 2
call
listidx++
if list[listidx] is not identsym
error 15
symidx = findsymbol(list[listidx].name, 3)
if symidx == -1
if findsymbol(list[listidx].name, 1) != -1 || findsymbol(list[listidx].name, 2) != -1
error 15
else
error 10
emit CAL (5, 0, L = level - table[symidx].level, M = symidx)
listidx++
begin-end
do
listidx++
statement()
while list[listidx] is semicolonsym
if list[listidx] is not endsym
if list[listidx] is identsym, callsym, beginsym, ifsym, dosym, readsym, or writesym
error 16
else
error 17
listidx++
if
listidx++
condition()
jpcidx = codeidx
emit JPC (8, R = registercounter, 0, M = 0)
registercounter--
if list[listidx] is not questionsym
error 18
listidx++
statement()
if list[listidx] is colonsym
listidx++
jmpidx = codeidx
emit JMP (7, 0, 0, M = 0)
code[jpcidx].m = codeidx
statement()
code[jmpidx].m = codeidx
else
code[jpcidx].m = codeidx
do-while
listidx++
loopidx = codeidx
statement()
if list[listidx] is not whilesym
error 19
listidx++
condition()
registercounter++
if registercounter >= 10
error 14
emit LIT(1, R = registercounter, 0, M = 0)
emit EQL (18, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
emit JPC (8, R = registercounter, 0, M = loopidx)
registercounter--
read
listidx++
if list[listidx] is not identsym
error 20
symbolname = list[listidx].name
listidx++
if list[listidx] is lbracketsym
listidx++
symidx = findsymbol(symbolname, 2)
if symidx == -1
if findsymbol(symbolname, 1) != -1
error 11
else if findsymbol(symbolname, 3) != -1
error 9
else
error 10
expression()
arrayidxreg = registercounter
if list[listidx] is not rbracketsym
error 5
listidx++
registercounter++
if registercounter >= 10
error 14
emit RED (10, R = registercounter, 0, 0)
registercounter++
if registercounter >= 10
error 14
emit LIT (1, R = registercounter, 0, table[symidx].addr)
emit ADD (13, R = arrayidxreg, L = arrayidxreg, M = registercounter)
registercounter--
emit STO (4, R = registercounter, L = level - table[symidx].level, M = arrayidxreg)
registercounter -= 2
else
symidx = findsymbol(symbolname, 1)
if symidx == -1
if findsymbol(symbolname, 2) != -1
error 12
else if findsymbol(symbolname, 3) != -1
error 9
else
error 10
registercounter++
if registercounter >= 10
error 14
emit LIT (1, R = registercounter, 0, table[symidx].addr)
varlocreg = registercounter
registercounter++
if registercounter >= 10
error 14
emit RED (10, R = registercounter, 0, 0)
emit STO (4, R = registercounter, L = level - table[symidx].level, M = varlocreg)
registercounter -= 2
write
listidx++
expression()
emit WRT (9, R = registercounter, 0, 0)
registercounter--
condition
expression()
if list[listidx] is eqlsym
listidx++
expression()
emit EQL (18, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else if list[listidx] is neqsym
listidx++
expression()
emit NEQ (19, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else if list[listidx] is lsssym
listidx++
expression()
emit LSS (20, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else if list[listidx] is leqsym
listidx++
expression()
emit LEQ (21, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else if list[listidx] is gtrsym
listidx++
expression()
emit GTR (22, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else if list[listidx] is geqsym
listidx++
expression()
emit GEQ (23, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else
error 21
expression
if list[listidx] is subsym
listidx++
term()
emit NEG (12, R = registercounter, 0, M = registercounter)
while list[listidx] is addsym or subsym
if list[listidx] is addsym
listidx++
term()
emit ADD (13, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else
listidx++
term()
emit SUB (14, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else
term()
while list[listidx] is addsym or subsym
if list[listidx] is addsym
listidx++
term()
emit ADD (13, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else
listidx++
term()
emit SUB (14, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
if list[listidx] is lparenthesissym, identsym, or numbersym
error 22
term
factor()
while list[listidx] is multsym, divsym, or modsym
if list[listidx] is multsym
listidx++
factor()
emit MUL (15, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else if list[listidx] is divsym
listidx++
factor()
emit DIV (16, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
else
listidx++
factor()
emit MOD (17, R = registercounter - 1, L = registercounter - 1, M = registercounter)
registercounter--
factor
symbolname
symidx
arrayidxreg
varlocreg
if list[listidx] is identsym
symbolname = list[listidx].name
listidx++
if list[listidx] is lbracketsym
listidx++
symidx = findsymbol(symbolname, 2)
if symidx == -1
if findsymbol(symbolname, 1) != -1
error 11
else if findsymbol(symbolname, 3) != -1
error 9
else
error 10
expression()
arrayidxreg = registercounter
if list[listidx] is not rbracketsym
error 5
listidx++
registercounter++
if registercounter >= 10
error 14
emit LIT (1, R = registercounter, 0, M = table[symidx].addr)
emit ADD (13, R = arrayidxreg, L = arrayidxreg, M = registercounter)
registercounter--
emit LOD (3, R = registercounter, L = level - table[symidx].level, M = arrayidxreg)
else
symidx = findsymbol(symbolname, 1)
if symidx == -1
if findsymbol(symbolname, 2) != -1
error 12
else if findsymbol(symbolname, 3) != -1
error 9
else
error 10
registercounter++
if registercounter >= 10
error 14
emit LIT (1, R = registercounter, 0, M = table[symidx].addr)
varlocreg = registercounter
emit LOD (3, R = registercounter, L = level - table[symidx].level, M = varlocreg)
else if list[listidx] is numbersym
registercounter++
if registercounter >= 10
error 14
emit LIT (1, R = registercounter, 0, M = list[listidx].value)
listidx++
else if list[listidx] is lparenthesissym
listidx++
expression()
if list[listidx] is not rparenthesissym
error 23
listidx++
else
error 24