Skip to content

Commit 8bdbcb3

Browse files
committed
moved exit from Lany to Larray
1 parent 587bd8f commit 8bdbcb3

File tree

5 files changed

+55
-19
lines changed

5 files changed

+55
-19
lines changed

compiler.py

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,34 +15,66 @@ class Compiler:
1515
# Remove Complex Operands
1616
############################################################################
1717

18-
def rco_exp(self, e: expr) -> Tuple[expr, Temporaries]:
18+
def rco_exp(self, e: expr, need_atomic : bool) -> Tuple[expr, Temporaries]:
1919
match e:
20-
case Constant(int):
21-
20+
case Constant(n):
21+
return Constant(n), []
2222
case Call(Name('input_int'),[]):
23-
23+
if need_atomic:
24+
tmp = Name(generate_name('tmp'))
25+
return tmp, [(tmp, Call(Name('input_int'),[]))]
26+
else:
27+
return Call(Name('input_int'),[]), []
2428
case UnaryOp(USub(), exp):
25-
(new_exp, temps) = self.rco_exp(exp)
26-
29+
(atm, temps) = self.rco_exp(exp, True)
30+
usub = UnaryOp(USub(), atm)
31+
if need_atomic:
32+
tmp = Name(generate_name('tmp'))
33+
return tmp, temps + [(tmp, usub)]
34+
else:
35+
return usub, temps
2736
case BinOp(exp1, Add(), exp2):
28-
(new_exp1, temps1) = self.rco_exp(exp1)
29-
(new_exp2, temps2) = self.rco_exp(exp2)
30-
37+
(atm1, temps1) = self.rco_exp(exp1, True)
38+
(atm2, temps2) = self.rco_exp(exp2, True)
39+
add = BinOp(atm1, Add(), atm2)
40+
if need_atomic:
41+
tmp = Name(generate_name('tmp'))
42+
return tmp, temps1 + temps2 + [(tmp, add)]
43+
else:
44+
return add, temps1 + temps2
3145
case BinOp(exp1, Sub(), exp2):
32-
(new_exp1, temps1) = self.rco_exp(exp1)
33-
(new_exp2, temps2) = self.rco_exp(exp2)
34-
46+
(atm1, temps1) = self.rco_exp(exp1, True)
47+
(atm2, temps2) = self.rco_exp(exp2, True)
48+
sub = BinOp(atm1, Sub(), atm2)
49+
if need_atomic:
50+
tmp = Name(generate_name('tmp'))
51+
return tmp, temps1 + temps2 + [(tmp, sub)]
52+
else:
53+
return sub, temps1 + temps2
3554
case Name(var):
36-
55+
return Name(var), []
3756
case _:
3857
raise Exception('rco_exp unexpected ' + repr(e))
3958

4059
def rco_stmt(self, s: stmt) -> List[stmt]:
41-
# YOUR CODE HERE
42-
raise Exception('rco_stmt not implemented')
60+
match s:
61+
case Expr(Call(Name('print'), [exp])):
62+
(atm, temps) = self.rco_exp(exp, True)
63+
return [Assign([var], init) for (var,init) in temps] + [Expr(Call(Name('print'), [atm]))]
64+
case Expr(exp) :
65+
(atm, temps) = self.rco_exp(exp, False)
66+
return [Assign([var], init) for (var,init) in temps]
67+
case Assign([Name(var)], exp):
68+
(atm, temps) = self.rco_exp(exp, False)
69+
return [Assign([x], init) for (x,init) in temps] + [Assign([Name(var)], atm)]
70+
case _:
71+
raise Exception('rco_stmt not implemented')
4372

4473
def remove_complex_operands(self, p: Module) -> Module:
45-
# YOUR CODE HERE
74+
match p:
75+
case Module(ss):
76+
sss = [self.rco_stmt(s) for s in ss]
77+
return Module(sum(sss, []))
4678
raise Exception('remove_complex_operands not implemented')
4779

4880

simple-test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def execute_and_check(program_filename, program_ast):
8080
tests = [dirpath + t for t in filter(is_python_extension, filenames)]
8181
break
8282
else:
83-
tests = [os.getcwd() + '/tests/var/' + 'sub-input.py']
83+
tests = [os.getcwd() + '/tests/var/' + 'sub-input-flat.py']
8484

8585
# Evaluate the compiler on each test program.
8686
for program_filename in tests:

type_check_Lany.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ def type_check_exp(self, e, env):
5656
case TagOf(value):
5757
self.check_exp(value, AnyType(), env)
5858
return IntType()
59-
case Call(Name('exit'), []):
60-
return Bottom()
6159
case AnnLambda(params, returns, body):
6260
new_env = {x:t for (x,t) in env.items()}
6361
for (x,t) in params:

type_check_Larray.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ def type_check_exp(self, e, env):
9494
return IntType()
9595
case AllocateArray(length, typ):
9696
return typ
97+
case Call(Name('exit'), []):
98+
return Bottom()
9799
case _:
98100
return super().type_check_exp(e, env)
99101

utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,8 @@ def compile_and_test(compiler, compiler_name,
11951195
trace('\n# source program: ' + os.path.basename(program_root) + '\n')
11961196
trace(program)
11971197
trace('')
1198+
trace(repr(program))
1199+
trace('')
11981200

11991201
if 'source' in type_check_dict.keys():
12001202
trace('\n# type checking source program\n')
@@ -1366,6 +1368,7 @@ def compile_and_test(compiler, compiler_name,
13661368
trace('\n# ' + passname + '\n')
13671369
program = compiler.remove_complex_operands(program)
13681370
trace(program)
1371+
trace(repr(program))
13691372
if passname in type_check_dict.keys():
13701373
type_check_dict[passname](program)
13711374
total_passes += 1
@@ -1378,6 +1381,7 @@ def compile_and_test(compiler, compiler_name,
13781381
trace('\n# ' + passname + '\n')
13791382
program = compiler.explicate_control(program)
13801383
trace(program)
1384+
trace(repr(program))
13811385
if passname in type_check_dict.keys():
13821386
type_check_dict[passname](program)
13831387
trace('type checking passed')

0 commit comments

Comments
 (0)