Skip to content

Commit b70508d

Browse files
committed
change to C interpreters, introducing tail
1 parent d70c6a3 commit b70508d

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

interp_Cfun.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ def interp_exp(self, e, env):
3232
case _:
3333
return super().interp_exp(e, env)
3434

35-
def interp_stmt(self, s, env, cont):
35+
def interp_tail(self, s, env):
3636
match s:
3737
case TailCall(func, args):
3838
return self.interp_exp(Call(func, args), env)
3939
case _:
40-
return super().interp_stmt(s, env, cont)
41-
40+
return super().interp_tail(s, env)
41+
4242
def interp(self, p):
4343
match p:
4444
case CProgramDefs(defs):

interp_Cif.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,32 @@
44

55
class InterpCif(InterpLif):
66

7-
def interp_stmt(self, s, env, cont):
8-
match s:
9-
case Return(value):
10-
return self.interp_exp(value, env)
11-
case Goto(label):
12-
return self.interp_stmts(self.blocks[label], env)
13-
case _:
14-
return super().interp_stmt(s, env, cont)
15-
167
def interp(self, p):
178
match p:
189
case CProgram(blocks):
1910
env = {}
2011
self.blocks = blocks
2112
self.interp_stmts(blocks[label_name('start')], env)
22-
13+
14+
def interp_stmts(self, ss, env):
15+
match ss:
16+
case [t]:
17+
return self.interp_tail(t, env)
18+
case [s, *ss]:
19+
self.interp_stmt(s, env, [])
20+
return self.interp_stmts(ss, env)
21+
22+
def interp_tail(self, s, env):
23+
match s:
24+
case Return(value):
25+
return self.interp_exp(value, env)
26+
case Goto(label):
27+
return self.interp_stmts(self.blocks[label], env)
28+
case If(test, [Goto(thn)], [Goto(els)]):
29+
match self.interp_exp(test, env):
30+
case True:
31+
return self.interp_stmts(self.blocks[thn], env)
32+
case False:
33+
return self.interp_stmts(self.blocks[els], env)
34+
case _:
35+
return super().interp_tail(s, env)

interp_Lfun.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ def interp(self, p):
5656
case Module(ss):
5757
env = {}
5858
self.interp_stmts(ss, env)
59-
#trace('interp global env: ' + repr(env))
6059
if 'main' in env.keys():
6160
self.apply_fun(env['main'], [], None)
6261
case _:

interp_Lint.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ def interp_stmt(self, s, env, cont):
6767
raise Exception('error in interp_stmt, unexpected ' + repr(s))
6868

6969
def interp_stmts(self, ss, env):
70-
if len(ss) == 0:
71-
return None
72-
else:
73-
return self.interp_stmt(ss[0], env, ss[1:])
70+
match ss:
71+
case []:
72+
return 0
73+
case [s, *ss]:
74+
return self.interp_stmt(s, env, ss)
7475

7576
def interp(self, p):
7677
match p:

0 commit comments

Comments
 (0)