Skip to content

Commit fe78615

Browse files
committed
updates to interpreters and type checkers
1 parent 53a1d70 commit fe78615

27 files changed

+1626
-77
lines changed

interp_Cany.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66

77
class InterpCany(InterpClambda):
88

9+
# hook to be overridden
10+
def interp_getitem(self, aggregate, index):
11+
return aggregate[index]
12+
13+
# hook to be overridden
14+
def interp_setitem(self, aggregate, index, value):
15+
aggregate[index] = value
16+
17+
# hook to be overridden
18+
def interp_len(self, aggregate):
19+
return len(aggregate)
20+
921
def interp_exp(self, e, env):
1022
match e:
1123
case Call(Name('make_any'), [value, tag]):
@@ -29,29 +41,31 @@ def interp_exp(self, e, env):
2941
return val
3042
case _:
3143
raise Exception('interp ValueOf unexpected ' + repr(v))
32-
case Call(Name('any_tuple_load'), [tup, index]):
44+
case Call(Name(atl), [tup, index]) \
45+
if atl == 'any_load' or atl == 'any_load_unsafe':
3346
tv = self.interp_exp(tup, env)
3447
n = self.interp_exp(index, env)
3548
match tv:
3649
case Tagged(v, tag):
37-
return v[n]
50+
return self.interp_getitem(v, n)
3851
case _:
39-
raise Exception('interp any_tuple_load unexpected ' + repr(tv))
40-
case Call(Name('any_tuple_store'), [tup, index, value]):
52+
raise Exception('interp any_load unexpected ' + repr(tv))
53+
case Call(Name(ats), [tup, index, value]) \
54+
if ats == 'any_store' or ats == 'any_store_unsafe':
4155
tv = self.interp_exp(tup, env)
4256
n = self.interp_exp(index, env)
4357
val = self.interp_exp(value, env)
4458
match tv:
4559
case Tagged(v, tag):
46-
v[n] = val
47-
return None # ??
60+
self.interp_setitem(v, n, val)
61+
return None
4862
case _:
49-
raise Exception('interp any_tuple_load unexpected ' + repr(tv))
63+
raise Exception('interp any_store unexpected ' + repr(tv))
5064
case Call(Name('any_len'), [value]):
5165
v = self.interp_exp(value, env)
5266
match v:
5367
case Tagged(value, tag):
54-
return len(value)
68+
return self.interp_len(value)
5569
case _:
5670
raise Exception('interp any_len unexpected ' + repr(v))
5771
case _:

interp_Carray.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from ast import *
2+
from interp_Ctup import InterpCtup
3+
from utils import *
4+
5+
class InterpCarray(InterpCtup):
6+
7+
def interp_exp(self, e, env):
8+
match e:
9+
case ast.List(es, Load()):
10+
return [self.interp_exp(e, env) for e in es]
11+
case BinOp(left, Mult(), right):
12+
l = self.interp_exp(left, env); r = self.interp_exp(right, env)
13+
return l * r
14+
case AllocateArray(length, typ):
15+
array = [None] * length
16+
return array
17+
case Call(Name('array_len'), [tup]):
18+
t = self.interp_exp(tup, env)
19+
return len(t)
20+
case Call(Name('array_load'), [tup, index]):
21+
t = self.interp_exp(tup, env)
22+
n = self.interp_exp(index, env)
23+
return t[n]
24+
case Call(Name('array_store'), [tup, index, value]):
25+
tup = self.interp_exp(tup, env)
26+
index = self.interp_exp(index, env)
27+
tup[index] = self.interp_exp(value, env)
28+
return None
29+
case _:
30+
return super().interp_exp(e, env)

interp_Cfun.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
from ast import *
2-
from interp_Ctup import InterpCtup
2+
from interp_Carray import InterpCarray
33
from utils import *
44
from interp_Lfun import Function
55

6-
class InterpCfun(InterpCtup):
6+
class InterpCfun(InterpCarray):
77

88
def apply_fun(self, fun, args, e):
99
match fun:
1010
case Function(name, xs, blocks, env):
1111
old_blocks = self.blocks
1212
self.blocks = blocks
13-
# trace('apply_fun ' + name)
14-
# trace(blocks.keys())
1513
new_env = {x: v for (x,v) in env.items()}
1614
for (x,arg) in zip(xs, args):
1715
new_env[x] = arg
@@ -23,9 +21,7 @@ def apply_fun(self, fun, args, e):
2321

2422
def interp_exp(self, e, env):
2523
match e:
26-
case Call(Name('input_int'), []):
27-
return super().interp_exp(e, env)
28-
case Call(Name('len'), [tup]):
24+
case Call(Name(f), args) if f in builtin_functions:
2925
return super().interp_exp(e, env)
3026
case Call(func, args):
3127
f = self.interp_exp(func, env)

interp_Cproxy.py

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from ast import *
2+
from interp_Ldyn import Tagged
3+
from interp_Llambda import ClosureTuple
4+
from interp_Cany import InterpCany
5+
from utils import *
6+
7+
class InterpCproxy(InterpCany):
8+
9+
def apply_fun(self, fun, args, e):
10+
match fun:
11+
case ClosureTuple(elts, arity):
12+
return self.apply_fun(elts[0], [elts] + args, e)
13+
case _:
14+
return super().apply_fun(fun, args, e)
15+
16+
def type_to_tag(self, typ):
17+
match typ:
18+
case ProxyOrTupleType(elt_types):
19+
return 'tuple'
20+
case _:
21+
return super().type_to_tag(typ)
22+
23+
def interp_getitem(self, aggregate, index):
24+
match aggregate:
25+
case ProxiedTuple(tup, reads):
26+
return self.apply_fun(reads[index],
27+
[self.interp_getitem(tup, index)], None)
28+
case ProxiedList(lst, read, write):
29+
return self.apply_fun(read, [self.interp_getitem(lst, index)], None)
30+
case _:
31+
return super().interp_getitem(aggregate, index)
32+
33+
def interp_setitem(self, aggregate, index, value):
34+
match aggregate:
35+
case ProxiedList(lst, read, write):
36+
value2 = self.apply_fun(write, [value], None)
37+
self.interp_setitem(lst, index, value2)
38+
case Tagged(agg, tag):
39+
self.interp_setitem(agg, index, value)
40+
case _:
41+
super().interp_setitem(aggregate, index, value)
42+
43+
def interp_len(self, aggregate):
44+
match aggregate:
45+
case ProxiedTuple(tup, reads):
46+
return self.interp_len(tup)
47+
case ProxiedList(lst, read, write):
48+
return self.interp_len(lst)
49+
case _:
50+
return super().interp_len(aggregate)
51+
52+
def interp_exp(self, e, env):
53+
match e:
54+
case TupleProxy(tup, reads, source, target):
55+
reads_ = self.interp_exp(reads, env)
56+
return ProxiedTuple(self.interp_exp(tup, env), reads__)
57+
case ListProxy(lst, read, write, source, target):
58+
read_ = self.interp_exp(read, env)
59+
write_ = self.interp_exp(write, env)
60+
return ProxiedList(self.interp_exp(lst, env), read_, write_)
61+
case Subscript(tup, index, Load()):
62+
t = self.interp_exp(tup, env)
63+
n = self.interp_exp(index, env)
64+
return self.interp_getitem(t, n)
65+
case InjectTupleProxy(proxy, typ):
66+
p = self.interp_exp(proxy, env)
67+
return ProxiedTuple(p[0], p[1])
68+
case InjectTuple(tup):
69+
return self.interp_exp(tup, env)
70+
case InjectListProxy(proxy, typ):
71+
p = self.interp_exp(proxy, env)
72+
return ProxiedList(p[0], p[1], p[2])
73+
case InjectList(tup):
74+
return self.interp_exp(tup, env)
75+
case Call(Name('is_tuple_proxy'), [arg]):
76+
p = self.interp_exp(arg, env)
77+
match p:
78+
case ProxiedTuple(tup, reads):
79+
return True
80+
case _:
81+
return False
82+
case Call(Name('is_array_proxy'), [arg]):
83+
p = self.interp_exp(arg, env)
84+
match p:
85+
case ProxiedList(tup, reads, writes):
86+
return True
87+
case _:
88+
return False
89+
case Call(Name('proxy_array_get'), [arr, index]):
90+
a = self.interp_exp(arr, env)
91+
i = self.interp_exp(index, env)
92+
return self.interp_getitem(a, i)
93+
case Call(Name('proxy_tuple_load'), [tup, index]):
94+
p = self.interp_exp(tup, env)
95+
i = self.interp_exp(index, env)
96+
return self.interp_getitem(p, i)
97+
case Call(Name('proxy_array_load'), [tup, index]):
98+
p = self.interp_exp(tup, env)
99+
i = self.interp_exp(index, env)
100+
return self.interp_getitem(p, i)
101+
case Call(Name('proxy_array_store'), [tup, index, value]):
102+
p = self.interp_exp(tup, env)
103+
i = self.interp_exp(index, env)
104+
v = self.interp_exp(value, env)
105+
self.interp_setitem(p, i, v)
106+
return None
107+
case Call(Name('project_array'), [array]):
108+
return self.interp_exp(array, env)
109+
case Call(Name('proxy_array_len'), [tup]):
110+
t = self.interp_exp(tup, env)
111+
return self.interp_len(t)
112+
case Call(Name('proxy_tuple_len'), [tup]):
113+
t = self.interp_exp(tup, env)
114+
return self.interp_len(t)
115+
case Call(Name('project_tuple'), [tup]):
116+
return self.interp_exp(tup, env)
117+
case _:
118+
return super().interp_exp(e, env)
119+

interp_Lany.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ def type_to_tag(self, typ):
1212
return 'function'
1313
case TupleType(fields):
1414
return 'tuple'
15+
case ListType(elt_ty):
16+
return 'tuple'
1517
case t if t == int:
1618
return 'int'
1719
case t if t == bool:
@@ -31,7 +33,19 @@ def arity(self, v):
3133
return arity
3234
case _:
3335
raise Exception('Lany arity unexpected ' + repr(v))
34-
36+
37+
# hook to be overridden
38+
def interp_getitem(self, aggregate, index):
39+
return aggregate[index]
40+
41+
# hook to be overridden
42+
def interp_setitem(self, aggregate, index, value):
43+
aggregate[index] = value
44+
45+
# hook to be overridden
46+
def interp_len(self, aggregate):
47+
return len(aggregate)
48+
3549
def interp_exp(self, e, env):
3650
match e:
3751
case Inject(value, typ):
@@ -45,29 +59,35 @@ def interp_exp(self, e, env):
4559
case _:
4660
raise Exception('interp project to ' + repr(typ) \
4761
+ ' unexpected ' + repr(v))
48-
case Call(Name('any_tuple_load'), [tup, index]):
62+
case Call(Name(atl), [tup, index]) \
63+
if atl == 'any_load' or atl == 'any_load_unsafe':
4964
tv = self.interp_exp(tup, env)
5065
n = self.interp_exp(index, env)
5166
match tv:
5267
case Tagged(v, tag):
53-
return v[n]
68+
return self.interp_getitem(v, n)
5469
case _:
55-
raise Exception('interp any_tuple_load unexpected ' + repr(tv))
56-
case Call(Name('any_tuple_store'), [tup, index, value]):
70+
raise Exception('interp any_load unexpected ' + repr(tv))
71+
case Call(Name(ats), [tup, index, value]) \
72+
if ats == 'any_store' or ats == 'any_store_unsafe':
5773
tv = self.interp_exp(tup, env)
5874
n = self.interp_exp(index, env)
5975
val = self.interp_exp(value, env)
6076
match tv:
6177
case Tagged(v, tag):
62-
v[n] = val
63-
return None # ??
78+
self.interp_setitem(v, n, val)
79+
return None
6480
case _:
65-
raise Exception('interp any_tuple_load unexpected ' + repr(tv))
81+
raise Exception('interp any_store unexpected ' + repr(tv))
82+
case Subscript(tup, index, Load()):
83+
t = self.interp_exp(tup, env)
84+
n = self.interp_exp(index, env)
85+
return self.interp_getitem(t, n)
6686
case Call(Name('any_len'), [value]):
6787
v = self.interp_exp(value, env)
6888
match v:
6989
case Tagged(value, tag):
70-
return len(value)
90+
return self.interp_len(value)
7191
case _:
7292
raise Exception('interp any_len unexpected ' + repr(v))
7393
case Call(Name('make_any'), [value, tag]):

interp_Larray.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from ast import *
2+
from interp_Ltup import InterpLtup
3+
from utils import *
4+
5+
class InterpLarray(InterpLtup):
6+
7+
def interp_exp(self, e, env):
8+
match e:
9+
case ast.List(es, Load()):
10+
return [self.interp_exp(e, env) for e in es]
11+
case BinOp(left, Mult(), right):
12+
l = self.interp_exp(left, env); r = self.interp_exp(right, env)
13+
return l * r
14+
case AllocateArray(length, typ):
15+
array = [None] * length
16+
return array
17+
case Call(Name('array_len'), [tup]):
18+
t = self.interp_exp(tup, env)
19+
return len(t)
20+
case Call(Name('array_load'), [tup, index]):
21+
t = self.interp_exp(tup, env)
22+
n = self.interp_exp(index, env)
23+
return t[n]
24+
case Call(Name('array_store'), [tup, index, value]):
25+
tup = self.interp_exp(tup, env)
26+
index = self.interp_exp(index, env)
27+
tup[index] = self.interp_exp(value, env)
28+
return None
29+
case _:
30+
return super().interp_exp(e, env)
31+
32+
def interp_stmts(self, ss, env):
33+
if len(ss) == 0:
34+
return
35+
match ss[0]:
36+
case Assign([Subscript(tup, index)], value):
37+
tup = self.interp_exp(tup, env)
38+
index = self.interp_exp(index, env)
39+
tup[index] = self.interp_exp(value, env)
40+
return self.interp_stmts(ss[1:], env)
41+
case _:
42+
return super().interp_stmts(ss, env)

0 commit comments

Comments
 (0)