37 |
|
|
38 |
val i_i_Ty = BT.intTy --> BT.intTy |
val i_i_Ty = BT.intTy --> BT.intTy |
39 |
val ii_u_Ty = BT.tupleTy [BT.intTy, BT.intTy] --> BT.unitTy |
val ii_u_Ty = BT.tupleTy [BT.intTy, BT.intTy] --> BT.unitTy |
40 |
|
val ii_u_u_Ty = ii_u_Ty --> BT.unitTy |
41 |
val u_u_Ty = BT.unitTy --> BT.unitTy |
val u_u_Ty = BT.unitTy --> BT.unitTy |
42 |
val u_u_u_Ty = BT.unitTy --> u_u_Ty |
val u_u_u_Ty = BT.unitTy --> u_u_Ty |
43 |
val iis_u_Ty = BT.tupleTy [BT.intTy, BT.intTy, BT.unitTy] --> BT.unitTy |
val iis_u_Ty = BT.tupleTy [BT.intTy, BT.intTy, BT.unitTy] --> BT.unitTy |
97 |
val bt_register = getCoreVal "bt_register" |
val bt_register = getCoreVal "bt_register" |
98 |
val bt_save = getCoreVal "bt_save" |
val bt_save = getCoreVal "bt_save" |
99 |
val bt_push = getCoreVal "bt_push" |
val bt_push = getCoreVal "bt_push" |
100 |
|
val bt_nopush = getCoreVal "bt_nopush" |
101 |
val bt_add = getCoreVal "bt_add" |
val bt_add = getCoreVal "bt_add" |
102 |
val matchcon = getCoreCon "Match" |
val matchcon = getCoreCon "Match" |
103 |
|
|
104 |
val bt_register_var = tmpvar ("<bt_register>", iis_u_Ty) |
val bt_register_var = tmpvar ("<bt_register>", iis_u_Ty) |
105 |
val bt_save_var = tmpvar ("<bt_save>", u_u_u_Ty) |
val bt_save_var = tmpvar ("<bt_save>", u_u_u_Ty) |
106 |
val bt_push_var = tmpvar ("<bt_push>", u_u_u_Ty) |
val bt_push_var = tmpvar ("<bt_push>", ii_u_u_Ty) |
107 |
|
val bt_nopush_var = tmpvar ("<bt_nopush>", ii_u_Ty) |
108 |
val bt_add_var = tmpvar ("<bt_add>", ii_u_Ty) |
val bt_add_var = tmpvar ("<bt_add>", ii_u_Ty) |
109 |
val bt_reserve_var = tmpvar ("<bt_reserve>", i_i_Ty) |
val bt_reserve_var = tmpvar ("<bt_reserve>", i_i_Ty) |
110 |
val bt_module_var = tmpvar ("<bt_module>", BT.intTy) |
val bt_module_var = tmpvar ("<bt_module>", BT.intTy) |
116 |
val pushexp = A.APPexp (VARexp bt_push_var, uExp) |
val pushexp = A.APPexp (VARexp bt_push_var, uExp) |
117 |
val saveexp = A.APPexp (VARexp bt_save_var, uExp) |
val saveexp = A.APPexp (VARexp bt_save_var, uExp) |
118 |
|
|
119 |
fun mkaddexp id = A.APPexp (VARexp bt_add_var, |
fun mkmodidexp fctvar id = |
120 |
EU.TUPLEexp [VARexp bt_module_var, |
A.APPexp (VARexp fctvar, |
121 |
INTexp id]) |
EU.TUPLEexp [VARexp bt_module_var, INTexp id]) |
122 |
|
|
123 |
|
val mkaddexp = mkmodidexp bt_add_var |
124 |
|
val mkpushexp = mkmodidexp bt_push_var |
125 |
|
val mknopushexp = mkmodidexp bt_nopush_var |
126 |
|
|
127 |
fun mkregexp (id, s) = |
fun mkregexp (id, s) = |
128 |
A.APPexp (VARexp bt_register_var, |
A.APPexp (VARexp bt_register_var, |
129 |
EU.TUPLEexp [VARexp bt_module_var, |
EU.TUPLEexp [VARexp bt_module_var, |
132 |
val regexps = ref [] |
val regexps = ref [] |
133 |
val next = ref 0 |
val next = ref 0 |
134 |
|
|
135 |
fun mkadd (id, s) = |
fun newid s = let |
136 |
(regexps := mkregexp (id, s) :: !regexps; |
val id = !next |
137 |
mkaddexp id) |
in |
138 |
|
next := id + 1; |
139 |
|
regexps := mkregexp (id, s) :: !regexps; |
140 |
|
id |
141 |
|
end |
142 |
|
|
143 |
|
val mkadd = mkaddexp o newid |
144 |
|
val mkpush = mkpushexp o newid |
145 |
|
val mknopush = mknopushexp o newid |
146 |
|
|
147 |
fun VALdec (v, e) = |
fun VALdec (v, e) = |
148 |
A.VALdec [A.VB { pat = A.VARpat v, exp = e, |
A.VALdec [A.VB { pat = A.VARpat v, exp = e, |
157 |
| is_prim_exp (A.MARKexp (e, _)) = is_prim_exp e |
| is_prim_exp (A.MARKexp (e, _)) = is_prim_exp e |
158 |
| is_prim_exp _ = false |
| is_prim_exp _ = false |
159 |
|
|
160 |
fun is_raise_exp (A.RAISEexp _) = true |
fun is_raise_exp (A.RAISEexp (e, _)) = |
161 |
|
let fun is_simple_exn (A.VARexp _) = true |
162 |
|
| is_simple_exn (A.CONexp _) = true |
163 |
|
| is_simple_exn (A.CONSTRAINTexp (e, _)) = is_simple_exn e |
164 |
|
| is_simple_exn (A.MARKexp (e, _)) = is_simple_exn e |
165 |
|
| is_simple_exn (A.RAISEexp (e, _)) = |
166 |
|
is_simple_exn e (* !! *) |
167 |
|
| is_simple_exn _ = false |
168 |
|
in |
169 |
|
is_simple_exn e |
170 |
|
end |
171 |
| is_raise_exp (A.MARKexp (e, _) | |
| is_raise_exp (A.MARKexp (e, _) | |
172 |
A.CONSTRAINTexp (e, _) | |
A.CONSTRAINTexp (e, _) | |
173 |
A.SEQexp [e]) = is_raise_exp e |
A.SEQexp [e]) = is_raise_exp e |
174 |
| is_raise_exp _ = false |
| is_raise_exp _ = false |
175 |
|
|
176 |
|
fun mkDescr ((n, r), what) = let |
177 |
|
fun name ((s, 0), a) = Symbol.name s :: a |
178 |
|
| name ((s, m), a) = Symbol.name s :: "[" :: |
179 |
|
Int.toString (m + 1) :: "]" :: a |
180 |
|
fun dot ([z], a) = name (z, a) |
181 |
|
| dot (h :: t, a) = dot (t, "." :: name (h, a)) |
182 |
|
| dot ([], a) = impossible (what ^ ": no path") |
183 |
|
val ms = matchstring r |
184 |
|
in |
185 |
|
concat (ms :: ": " :: dot (n, [])) |
186 |
|
end |
187 |
|
|
188 |
fun i_exp _ loc (A.RECORDexp l) = |
fun i_exp _ loc (A.RECORDexp l) = |
189 |
A.RECORDexp (map (fn (l, e) => (l, i_exp false loc e)) l) |
A.RECORDexp (map (fn (l, e) => (l, i_exp false loc e)) l) |
190 |
| i_exp _ loc (A.SELECTexp (l, e)) = |
| i_exp _ loc (A.SELECTexp (l, e)) = |
193 |
A.VECTORexp (map (i_exp false loc) l, t) |
A.VECTORexp (map (i_exp false loc) l, t) |
194 |
| i_exp tail loc (A.PACKexp (e, t, tcl)) = |
| i_exp tail loc (A.PACKexp (e, t, tcl)) = |
195 |
A.PACKexp (i_exp tail loc e, t, tcl) |
A.PACKexp (i_exp tail loc e, t, tcl) |
196 |
| i_exp tail loc (e as A.APPexp (f, a)) = |
| i_exp tail loc (e as A.APPexp (f, a)) = let |
197 |
if tail orelse is_prim_exp f then |
val mainexp = A.APPexp (i_exp false loc f, i_exp false loc a) |
198 |
A.APPexp (i_exp false loc f, i_exp false loc a) |
in |
199 |
|
if is_prim_exp f then mainexp |
200 |
|
else if tail then A.SEQexp [mknopush (mkDescr (loc, "GOTO")), |
201 |
|
mainexp] |
202 |
else let |
else let |
|
val mainexp = A.APPexp (i_exp false loc f, |
|
|
i_exp false loc a) |
|
203 |
val ty = Reconstruct.expType e |
val ty = Reconstruct.expType e |
204 |
val result = tmpvar ("tmpresult", ty) |
val result = tmpvar ("tmpresult", ty) |
205 |
val restore = tmpvar ("tmprestore", u_u_Ty) |
val restore = tmpvar ("tmprestore", u_u_Ty) |
206 |
|
val pushexp = mkpush (mkDescr (loc, "CALL")) |
207 |
in |
in |
208 |
LETexp (restore, pushexp, |
LETexp (restore, pushexp, |
209 |
LETexp (result, mainexp, |
LETexp (result, mainexp, |
210 |
A.SEQexp [AUexp restore, VARexp result])) |
A.SEQexp [AUexp restore, |
211 |
|
VARexp result])) |
212 |
|
end |
213 |
end |
end |
214 |
| i_exp tail loc (A.HANDLEexp (e, A.HANDLER (A.FNexp (rl, t)))) = let |
| i_exp tail loc (A.HANDLEexp (e, A.HANDLER (A.FNexp (rl, t)))) = let |
215 |
val restore = tmpvar ("tmprestore", u_u_Ty) |
val restore = tmpvar ("tmprestore", u_u_Ty) |
227 |
| i_exp tail loc (A.CASEexp (e, rl, b)) = |
| i_exp tail loc (A.CASEexp (e, rl, b)) = |
228 |
A.CASEexp (i_exp false loc e, map (i_rule tail loc) rl, b) |
A.CASEexp (i_exp false loc e, map (i_rule tail loc) rl, b) |
229 |
| i_exp tail loc (A.FNexp (rl, t)) = let |
| i_exp tail loc (A.FNexp (rl, t)) = let |
230 |
fun name ((s, 0), a) = Symbol.name s :: a |
val addexp = mkadd (mkDescr (loc, "FN")) |
|
| name ((s, m), a) = Symbol.name s :: "[" :: |
|
|
Int.toString (m + 1) :: "]" :: a |
|
|
fun dot ([z], a) = name (z, a) |
|
|
| dot (h :: t, a) = dot (t, "." :: name (h, a)) |
|
|
| dot ([], a) = impossible "FNexp: no path" |
|
|
val (n, r) = loc |
|
|
val ms = matchstring r |
|
|
val descr = concat (ms :: ": " :: dot (n, [])) |
|
|
val id = !next |
|
|
val _ = next := id + 1 |
|
|
val addexp = mkadd (id, descr) |
|
231 |
val arg = tmpvar ("fnvar", t) |
val arg = tmpvar ("fnvar", t) |
232 |
val rl' = map (i_rule true loc) rl |
val rl' = map (i_rule true loc) rl |
233 |
val re = let |
val re = let |
336 |
INTexp (!next))), |
INTexp (!next))), |
337 |
VALdec (bt_save_var, AUexp bt_save), |
VALdec (bt_save_var, AUexp bt_save), |
338 |
VALdec (bt_push_var, AUexp bt_push), |
VALdec (bt_push_var, AUexp bt_push), |
339 |
|
VALdec (bt_nopush_var, AUexp bt_nopush), |
340 |
VALdec (bt_register_var, AUexp bt_register), |
VALdec (bt_register_var, AUexp bt_register), |
341 |
VALdec (bt_add_var, |
VALdec (bt_add_var, |
342 |
A.SEQexp (!regexps @ [AUexp bt_add]))], |
A.SEQexp (!regexps @ [AUexp bt_add]))], |