1signature TREE =
2sig
3  type size
4
5datatype stm = SEQ of stm * stm
6             | LABEL of Temp.label
7             | JUMP of Temp.label
8             | CJUMP of exp * Temp.label
9             | MOVE of exp * exp
10             | EXP of exp
11
12     and exp = BINOP of binop * exp * exp
13             | RELOP of relop * exp * exp
14             | MEM of exp
15             | TEMP of Temp.temp
16             | ESEQ of stm * exp
17             | NAME of Temp.label
18             | NCONST of Arbint.int
19             | WCONST of Arbint.int
20             | CALL of exp * exp
21             | PAIR of exp * exp
22
23      and binop = PLUS | MINUS | MUL | DIV
24                | AND | OR | LSHIFT | RSHIFT | ARSHIFT | XOR | ROR
25
26      and relop = EQ | NE | LT | GT | LE | GE | CC | LS | HI | CS
27
28      val pair2list : exp -> exp list
29 (*
30  val notRel : relop -> relop
31  val commute: relop -> relop
32 *)
33
34end
35
36structure Tree : TREE =
37struct
38  type size = int
39
40datatype stm = SEQ of stm * stm
41             | LABEL of Temp.label
42             | JUMP of Temp.label
43             | CJUMP of exp * Temp.label
44             | MOVE of exp * exp
45             | EXP of exp
46
47     and exp = BINOP of binop * exp * exp
48             | RELOP of relop * exp * exp
49             | MEM of exp
50             | TEMP of Temp.temp
51             | ESEQ of stm * exp
52             | NAME of Temp.label
53             | NCONST of Arbint.int
54             | WCONST of Arbint.int
55             | CALL of exp * exp
56             | PAIR of exp * exp
57
58      and binop = PLUS | MINUS | MUL | DIV
59                | AND | OR | LSHIFT | RSHIFT | ARSHIFT | XOR | ROR
60
61      and relop = EQ | NE | LT | GT | LE | GE
62                | CC | LS | HI | CS
63
64  fun pair2list (PAIR(v1, v2)) =
65        (pair2list v1) @ (pair2list v2)
66   |  pair2list v = [v]
67
68end
69