Skip to content

Commit 10fd80e

Browse files
committed
interpreters and AST nodes for tuple chapter
1 parent 76f3696 commit 10fd80e

File tree

9 files changed

+303
-57
lines changed

9 files changed

+303
-57
lines changed

interp_Ctup.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from ast import *
2+
from interp_Cif import InterpCif
3+
from utils import *
4+
5+
class InterpCtup(InterpCif):
6+
7+
def interp_exp(self, e, env):
8+
match e:
9+
case Tuple(es, Load()):
10+
return tuple([self.interp_exp(e, env) for e in es])
11+
case Subscript(tup, index, Load()):
12+
t = self.interp_exp(tup, env)
13+
n = self.interp_exp(index, env)
14+
return t[n]
15+
case Allocate(length, typ):
16+
array = [None] * length
17+
return array
18+
case Begin(ss, e):
19+
self.interp_stmts(ss, env)
20+
return self.interp_exp(e, env)
21+
case GlobalValue(name):
22+
return 0 # bogus
23+
case _:
24+
return super().interp_exp(e, env)
25+
26+
def interp_stmts(self, ss, env):
27+
if len(ss) == 0:
28+
return
29+
match ss[0]:
30+
case Collect(size):
31+
return self.interp_stmts(ss[1:], env)
32+
case Assign([Subscript(tup, index)], value):
33+
tup = self.interp_exp(tup, env)
34+
index = self.interp_exp(index, env)
35+
tup[index] = self.interp_exp(value, env)
36+
return self.interp_stmts(ss[1:], env)
37+
case _:
38+
return super().interp_stmts(ss, env)

interp_Ltup.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from ast import *
2+
from interp_Lwhile import InterpLwhile
3+
from utils import *
4+
5+
class InterpLtup(InterpLwhile):
6+
7+
def interp_cmp(self, cmp):
8+
match cmp:
9+
case Is():
10+
return lambda x, y: x is y
11+
case _:
12+
return super().interp_cmp(cmp)
13+
14+
def interp_exp(self, e, env):
15+
match e:
16+
case Tuple(es, Load()):
17+
return tuple([self.interp_exp(e, env) for e in es])
18+
case Subscript(tup, index, Load()):
19+
t = self.interp_exp(tup, env)
20+
n = self.interp_exp(index, env)
21+
return t[n]
22+
case Allocate(length, typ):
23+
array = [None] * length
24+
return array
25+
case Begin(ss, e):
26+
self.interp_stmts(ss, env)
27+
return self.interp_exp(e, env)
28+
case GlobalValue(name):
29+
return 0 # ???
30+
case _:
31+
return super().interp_exp(e, env)
32+
33+
def interp_stmts(self, ss, env):
34+
if len(ss) == 0:
35+
return
36+
match ss[0]:
37+
case Collect(size):
38+
return self.interp_stmts(ss[1:], env)
39+
case Assign([Subscript(tup, index)], value):
40+
tup = self.interp_exp(tup, env)
41+
index = self.interp_exp(index, env)
42+
tup[index] = self.interp_exp(value, env)
43+
return self.interp_stmts(ss[1:], env)
44+
case _:
45+
return super().interp_stmts(ss, env)
46+
47+
if __name__ == "__main__":
48+
t1 = Tuple([Constant(1), Constant(2)], Load())
49+
t1_at_0 = Subscript(t1, Constant(0), Load())
50+
pr = Expr(Call(Name('print'), [t1_at_0]))
51+
p = Module([pr])
52+
InterpLtup().interp(p)
53+
24 Bytes
Binary file not shown.
100 Bytes
Binary file not shown.
-10 Bytes
Binary file not shown.

interp_x86/convert_x86.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from lark import Tree
55
from ast import Name, Constant
66
from x86_ast import *
7-
from utils import label_name
7+
from utils import label_name, GlobalValue
88

99
def convert_int(value):
1010
if value >= 0:
@@ -24,6 +24,8 @@ def convert_arg(arg):
2424
return Tree('mem_a', [convert_int(offset), reg])
2525
case ByteReg(id):
2626
return Tree('reg_a', [id])
27+
case GlobalValue(id):
28+
return Tree('global_val_a', [id, 'rip'])
2729
case _:
2830
raise Exception('convert_arg: unhandled ' + repr(arg))
2931

interp_x86/eval_x86.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,13 @@ def eval_instrs(self, instrs, blocks, output):
275275
raise Exception('jump to invalid target ' + target)
276276
return # after jumping, toss continuation
277277

278-
elif instr.data in ['sete', 'setl', 'setle', 'setg', 'setge']:
278+
elif instr.data in ['sete', 'setne', 'setl', 'setle', 'setg', 'setge']:
279279
a1 = instr.children[0]
280280

281281
if instr.data == 'sete' and self.registers['EFLAGS'] == 'e':
282282
self.store_arg(a1, 1)
283+
elif instr.data == 'setne' and self.registers['EFLAGS'] != 'e':
284+
self.store_arg(a1, 1)
283285
elif instr.data == 'setl' and self.registers['EFLAGS'] == 'l':
284286
self.store_arg(a1, 1)
285287
elif instr.data == 'setle' \

0 commit comments

Comments
 (0)