equal
deleted
inserted
replaced
|
1 CodeGen = Main + |
|
2 types 'v binop = 'v => 'v => 'v |
|
3 datatype ('a,'v) expr = Cex 'v |
|
4 | Vex 'a |
|
5 | Bex ('v binop) (('a,'v) expr) (('a,'v) expr) |
|
6 consts value :: ('a => 'v) => ('a,'v)expr => 'v |
|
7 primrec |
|
8 "value env (Cex v) = v" |
|
9 "value env (Vex a) = env a" |
|
10 "value env (Bex f e1 e2) = f (value env e1) (value env e2)" |
|
11 datatype ('a,'v) instr = Const 'v |
|
12 | Load 'a |
|
13 | Apply ('v binop) |
|
14 consts exec :: ('a => 'v) => 'v list => (('a,'v) instr) list => 'v list |
|
15 primrec |
|
16 "exec s vs [] = vs" |
|
17 "exec s vs (i#is) = (case i of |
|
18 Const v => exec s (v#vs) is |
|
19 | Load a => exec s ((s a)#vs) is |
|
20 | Apply f => exec s ( (f (hd vs) (hd(tl vs)))#(tl(tl vs)) ) is)" |
|
21 consts comp :: ('a,'v) expr => (('a,'v) instr) list |
|
22 primrec |
|
23 "comp (Cex v) = [Const v]" |
|
24 "comp (Vex a) = [Load a]" |
|
25 "comp (Bex f e1 e2) = (comp e2) @ (comp e1) @ [Apply f]" |
|
26 end |