|
4 | 4 |
|
5 | 5 | class InterpCif(InterpLif): |
6 | 6 |
|
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 | | - |
16 | 7 | def interp(self, p): |
17 | 8 | match p: |
18 | 9 | case CProgram(blocks): |
19 | 10 | env = {} |
20 | 11 | self.blocks = blocks |
21 | 12 | 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) |
0 commit comments