5377
|
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
|