| author | wenzelm |
| Mon, 10 Apr 2006 00:33:52 +0200 | |
| changeset 19393 | 78d6b7a01b12 |
| parent 19341 | 3414c04fbc39 |
| child 19466 | 29bc35832a77 |
| permissions | -rw-r--r-- |
|
18169
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
1 |
(* Title: Pure/Tools/codegen_serializer.ML |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
2 |
ID: $Id$ |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
3 |
Author: Florian Haftmann, TU Muenchen |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
4 |
|
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
5 |
Serializer from intermediate language ("Thin-gol") to
|
| 18216 | 6 |
target languages (like ML or Haskell). |
|
18169
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
7 |
*) |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
8 |
|
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
9 |
signature CODEGEN_SERIALIZER = |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
10 |
sig |
| 18702 | 11 |
type 'a pretty_syntax; |
12 |
type serializer = |
|
13 |
string list list |
|
| 18756 | 14 |
-> OuterParse.token list -> |
| 18865 | 15 |
((string -> string option) |
16 |
* (string -> CodegenThingol.itype pretty_syntax option) |
|
| 18702 | 17 |
* (string -> CodegenThingol.iexpr pretty_syntax option) |
18 |
-> string list option |
|
| 18756 | 19 |
-> CodegenThingol.module -> unit) |
20 |
* OuterParse.token list; |
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
21 |
val parse_syntax: ('b -> int) -> (string -> 'b -> 'a * 'b) -> OuterParse.token list ->
|
| 18702 | 22 |
('b -> 'a pretty_syntax * 'b) * OuterParse.token list;
|
| 18963 | 23 |
val parse_targetdef: string -> CodegenThingol.prim list; |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
24 |
val pretty_list: string -> string -> int * string -> CodegenThingol.iexpr pretty_syntax; |
| 18702 | 25 |
val serializers: {
|
| 18865 | 26 |
ml: string * (string * string * (string -> bool) -> serializer), |
| 18919 | 27 |
haskell: string * (string list -> serializer) |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
28 |
}; |
| 19150 | 29 |
val mk_flat_ml_resolver: string list -> string -> string; |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
30 |
val ml_fun_datatype: string * string * (string -> bool) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
31 |
-> ((string -> CodegenThingol.itype pretty_syntax option) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
32 |
* (string -> CodegenThingol.iexpr pretty_syntax option)) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
33 |
-> (string -> string) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
34 |
-> ((string * CodegenThingol.funn) list -> Pretty.T) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
35 |
* ((string * CodegenThingol.datatyp) list -> Pretty.T); |
|
18169
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
36 |
end; |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
37 |
|
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
38 |
structure CodegenSerializer: CODEGEN_SERIALIZER = |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
39 |
struct |
|
45def66f86cb
added modules for code generator generation two, not operational yet
haftmann
parents:
diff
changeset
|
40 |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
41 |
open BasicCodegenThingol; |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
42 |
val debug_msg = CodegenThingol.debug_msg; |
| 18850 | 43 |
|
| 18216 | 44 |
(** generic serialization **) |
45 |
||
| 18702 | 46 |
(* precedences *) |
47 |
||
| 18216 | 48 |
datatype lrx = L | R | X; |
49 |
||
| 18516 | 50 |
datatype fixity = |
| 18216 | 51 |
BR |
52 |
| NOBR |
|
53 |
| INFX of (int * lrx); |
|
54 |
||
| 18702 | 55 |
datatype 'a mixfix = |
56 |
Arg of fixity |
|
57 |
| Ignore |
|
58 |
| Pretty of Pretty.T |
|
59 |
| Quote of 'a; |
|
| 18516 | 60 |
|
| 18865 | 61 |
type 'a pretty_syntax = (int * int) * (fixity -> (fixity -> 'a -> Pretty.T) |
62 |
-> 'a list -> Pretty.T); |
|
| 18516 | 63 |
|
| 18216 | 64 |
fun eval_lrx L L = false |
65 |
| eval_lrx R R = false |
|
66 |
| eval_lrx _ _ = true; |
|
67 |
||
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
68 |
fun eval_fxy NOBR _ = false |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
69 |
| eval_fxy _ BR = true |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
70 |
| eval_fxy _ NOBR = false |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
71 |
| eval_fxy (INFX (pr, lr)) (INFX (pr_ctxt, lr_ctxt)) = |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
72 |
pr < pr_ctxt |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
73 |
orelse pr = pr_ctxt |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
74 |
andalso eval_lrx lr lr_ctxt |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
75 |
| eval_fxy _ (INFX _) = false; |
| 18216 | 76 |
|
| 18702 | 77 |
val str = setmp print_mode [] Pretty.str; |
| 18216 | 78 |
|
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
79 |
fun gen_brackify _ [p] = p |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
80 |
| gen_brackify true (ps as _::_) = Pretty.enclose "(" ")" ps
|
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
81 |
| gen_brackify false (ps as _::_) = Pretty.block ps; |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
82 |
|
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
83 |
fun brackify fxy_ctxt ps = |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
84 |
gen_brackify (eval_fxy BR fxy_ctxt) (Pretty.breaks ps); |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
85 |
|
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
86 |
fun brackify_infix infx fxy_ctxt ps = |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
87 |
gen_brackify (eval_fxy (INFX infx) fxy_ctxt) (Pretty.breaks ps); |
| 18216 | 88 |
|
| 19136 | 89 |
fun from_app mk_app from_expr const_syntax fxy ((c, ty), es) = |
| 18702 | 90 |
let |
91 |
fun mk NONE es = |
|
| 18865 | 92 |
brackify fxy (mk_app c es) |
| 18702 | 93 |
| mk (SOME ((i, k), pr)) es = |
| 19136 | 94 |
(*if i <= length es then*) |
95 |
let |
|
96 |
val (es1, es2) = chop k es; |
|
97 |
in |
|
98 |
brackify fxy (pr fxy from_expr es1 :: map (from_expr BR) es2) |
|
99 |
end |
|
100 |
(*else |
|
101 |
error ("illegal const_syntax")*)
|
|
| 18865 | 102 |
in mk (const_syntax c) es end; |
103 |
||
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
104 |
fun fillin_mixfix fxy_this ms fxy_ctxt pr args = |
| 18702 | 105 |
let |
106 |
fun fillin [] [] = |
|
| 19008 | 107 |
[] |
| 18702 | 108 |
| fillin (Arg fxy :: ms) (a :: args) = |
109 |
pr fxy a :: fillin ms args |
|
110 |
| fillin (Ignore :: ms) args = |
|
111 |
fillin ms args |
|
112 |
| fillin (Pretty p :: ms) args = |
|
113 |
p :: fillin ms args |
|
114 |
| fillin (Quote q :: ms) args = |
|
| 19008 | 115 |
pr BR q :: fillin ms args |
116 |
| fillin [] _ = |
|
117 |
error ("inconsistent mixfix: too many arguments")
|
|
118 |
| fillin _ [] = |
|
119 |
error ("inconsistent mixfix: too less arguments");
|
|
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
120 |
in gen_brackify (eval_fxy fxy_this fxy_ctxt) (fillin ms args) end; |
| 18702 | 121 |
|
122 |
||
123 |
(* user-defined syntax *) |
|
124 |
||
125 |
val (atomK, infixK, infixlK, infixrK) = |
|
| 18756 | 126 |
("target_atom", "infix", "infixl", "infixr");
|
127 |
val _ = OuterSyntax.add_keywords [atomK, infixK, infixlK, infixrK]; |
|
| 18216 | 128 |
|
| 18702 | 129 |
fun parse_infix (fixity as INFX (i, x)) s = |
130 |
let |
|
131 |
val l = case x of L => fixity |
|
132 |
| _ => INFX (i, X); |
|
133 |
val r = case x of R => fixity |
|
134 |
| _ => INFX (i, X); |
|
135 |
in |
|
136 |
pair [Arg l, (Pretty o Pretty.brk) 1, (Pretty o str) s, (Pretty o Pretty.brk) 1, Arg r] |
|
137 |
end; |
|
138 |
||
139 |
fun parse_mixfix reader s ctxt = |
|
| 18335 | 140 |
let |
| 18702 | 141 |
fun sym s = Scan.lift ($$ s); |
142 |
fun lift_reader ctxt s = |
|
143 |
ctxt |
|
144 |
|> reader s |
|
145 |
|-> (fn x => pair (Quote x)); |
|
146 |
val sym_any = Scan.lift (Scan.one Symbol.not_eof); |
|
147 |
val parse = Scan.repeat ( |
|
148 |
(sym "_" -- sym "_" >> K (Arg NOBR)) |
|
149 |
|| (sym "_" >> K (Arg BR)) |
|
150 |
|| (sym "?" >> K Ignore) |
|
151 |
|| (sym "/" |-- Scan.repeat (sym " ") >> (Pretty o Pretty.brk o length)) |
|
152 |
|| Scan.depend (fn ctxt => $$ "{" |-- $$ "*" |-- Scan.repeat1
|
|
153 |
( $$ "'" |-- Scan.one Symbol.not_eof |
|
154 |
|| Scan.unless ($$ "*" -- $$ "}") (Scan.one Symbol.not_eof)) --| |
|
155 |
$$ "*" --| $$ "}" >> (implode #> lift_reader ctxt #> swap)) |
|
156 |
|| (Scan.repeat1 |
|
157 |
( sym "'" |-- sym_any |
|
158 |
|| Scan.unless (sym "_" || sym "?" || sym "/" || sym "{" |-- sym "*")
|
|
159 |
sym_any) >> (Pretty o str o implode))); |
|
160 |
in case Scan.finite' Symbol.stopper parse (ctxt, Symbol.explode s) |
|
161 |
of (p, (ctxt, [])) => (p, ctxt) |
|
162 |
| _ => error ("Malformed mixfix annotation: " ^ quote s)
|
|
163 |
end; |
|
164 |
||
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
165 |
fun parse_nonatomic_mixfix reader s ctxt = |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
166 |
case parse_mixfix reader s ctxt |
| 18865 | 167 |
of ([Pretty _], _) => |
168 |
error ("mixfix contains just one pretty element; either declare as "
|
|
169 |
^ quote atomK ^ " or consider adding a break") |
|
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
170 |
| x => x; |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
171 |
|
| 18702 | 172 |
fun parse_syntax_proto reader = OuterParse.$$$ "(" |-- (
|
| 18865 | 173 |
OuterParse.$$$ infixK |-- OuterParse.nat |
174 |
>> (fn i => (parse_infix (INFX (i, X)), INFX (i, X))) |
|
175 |
|| OuterParse.$$$ infixlK |-- OuterParse.nat |
|
176 |
>> (fn i => (parse_infix (INFX (i, L)), INFX (i, L))) |
|
177 |
|| OuterParse.$$$ infixrK |-- OuterParse.nat |
|
178 |
>> (fn i => (parse_infix (INFX (i, R)), INFX (i, R))) |
|
| 18702 | 179 |
|| OuterParse.$$$ atomK |-- pair (parse_mixfix reader, NOBR) |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
180 |
|| pair (parse_nonatomic_mixfix reader, BR) |
| 18702 | 181 |
) -- OuterParse.string --| OuterParse.$$$ ")" >> (fn ((p, fxy), s) => (p s, fxy)); |
| 18282 | 182 |
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
183 |
fun parse_syntax no_args reader = |
| 18335 | 184 |
let |
| 18702 | 185 |
fun is_arg (Arg _) = true |
186 |
| is_arg Ignore = true |
|
187 |
| is_arg _ = false; |
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
188 |
fun mk fixity mfx ctxt = |
| 18702 | 189 |
let |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
190 |
val i = (length o List.filter is_arg) mfx; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
191 |
val _ = if i > no_args ctxt then error "too many arguments in codegen syntax" else (); |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
192 |
in (((i, i), fillin_mixfix fixity mfx), ctxt) end; |
| 18702 | 193 |
in |
194 |
parse_syntax_proto reader |
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
195 |
#-> (fn (mfx_reader, fixity) => |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
196 |
pair (mfx_reader #-> (fn mfx => mk fixity mfx)) |
| 18702 | 197 |
) |
198 |
end; |
|
199 |
||
200 |
fun newline_correct s = |
|
201 |
s |
|
202 |
|> Symbol.strip_blanks |
|
203 |
|> space_explode "\n" |
|
204 |
|> map (implode o (fn [] => [] |
|
205 |
| (" "::xs) => xs
|
|
206 |
| xs => xs) o explode) |
|
207 |
|> space_implode "\n"; |
|
208 |
||
| 18963 | 209 |
fun parse_targetdef s = |
| 18702 | 210 |
case Scan.finite Symbol.stopper (Scan.repeat ( |
| 18963 | 211 |
($$ "`" |-- $$ "`" >> (CodegenThingol.Pretty o str)) |
| 18702 | 212 |
|| ($$ "`" |-- Scan.repeat1 (Scan.unless ($$ "`") (Scan.one Symbol.not_eof)) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
213 |
--| $$ "`" >> (fn ["_"] => CodegenThingol.Name | s => error ("malformed antiquote: " ^ implode s)))
|
| 18702 | 214 |
|| Scan.repeat1 |
| 18963 | 215 |
(Scan.unless ($$ "`") (Scan.one Symbol.not_eof)) >> (CodegenThingol.Pretty o str o implode) |
| 19038 | 216 |
)) ((Symbol.explode o Symbol.strip_blanks) s) |
| 18702 | 217 |
of (p, []) => p |
| 18963 | 218 |
| (p, ss) => error ("Malformed definition: " ^ quote s ^ " - " ^ commas ss);
|
| 18702 | 219 |
|
220 |
||
221 |
(* abstract serializer *) |
|
| 18282 | 222 |
|
| 18702 | 223 |
type serializer = |
224 |
string list list |
|
| 18756 | 225 |
-> OuterParse.token list -> |
| 18865 | 226 |
((string -> string option) |
| 18963 | 227 |
* (string -> itype pretty_syntax option) |
228 |
* (string -> iexpr pretty_syntax option) |
|
| 18702 | 229 |
-> string list option |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
230 |
-> CodegenThingol.module -> unit) |
| 18756 | 231 |
* OuterParse.token list; |
| 18702 | 232 |
|
| 18919 | 233 |
fun abstract_serializer (target, nspgrp) name_root (from_defs, from_module, validator, postproc) |
| 18963 | 234 |
postprocess preprocess (class_syntax, tyco_syntax, const_syntax) |
| 18865 | 235 |
select module = |
| 18702 | 236 |
let |
| 18963 | 237 |
fun pretty_of_prim resolv (name, primdef) = |
238 |
let |
|
239 |
fun pr (CodegenThingol.Pretty p) = p |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
240 |
| pr CodegenThingol.Name = (str o resolv) name; |
| 18963 | 241 |
in case AList.lookup (op = : string * string -> bool) primdef target |
| 18702 | 242 |
of NONE => error ("no primitive definition for " ^ quote name)
|
| 18963 | 243 |
| SOME ps => (case map pr ps |
244 |
of [] => NONE |
|
245 |
| ps => (SOME o Pretty.block) ps) |
|
246 |
end; |
|
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
247 |
fun from_module' resolv imps ((name_qual, name), defs) = |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
248 |
from_module resolv imps ((name_qual, name), defs) |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
249 |
|> postprocess (resolv name_qual); |
| 18702 | 250 |
in |
251 |
module |
|
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
252 |
|> debug_msg (fn _ => "selecting submodule...") |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
253 |
|> (if is_some select then (CodegenThingol.project_module o the) select else I) |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
254 |
|> debug_msg (fn _ => "preprocessing...") |
| 18702 | 255 |
|> preprocess |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
256 |
|> debug_msg (fn _ => "serializing...") |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
257 |
|> CodegenThingol.serialize (from_defs (pretty_of_prim, (class_syntax : string -> string option, tyco_syntax, const_syntax))) |
| 18919 | 258 |
from_module' validator postproc nspgrp name_root |
| 18850 | 259 |
|> K () |
| 18702 | 260 |
end; |
261 |
||
| 19150 | 262 |
fun replace_invalid s = |
263 |
let |
|
264 |
fun replace_invalid c = |
|
265 |
if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'" |
|
266 |
andalso not (NameSpace.separator = c) |
|
267 |
then c |
|
268 |
else "_"; |
|
269 |
fun contract "_" (acc as "_" :: _) = acc |
|
270 |
| contract c acc = c :: acc; |
|
271 |
fun contract_underscores s = |
|
272 |
implode (fold_rev contract (explode s) []); |
|
273 |
in |
|
274 |
s |
|
275 |
|> translate_string replace_invalid |
|
276 |
|> contract_underscores |
|
277 |
end; |
|
278 |
||
| 18702 | 279 |
fun abstract_validator keywords name = |
280 |
let |
|
281 |
fun replace_invalid c = |
|
282 |
if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'" |
|
283 |
andalso not (NameSpace.separator = c) |
|
284 |
then c |
|
285 |
else "_" |
|
286 |
fun suffix_it name = |
|
287 |
name |
|
288 |
|> member (op =) keywords ? suffix "'" |
|
289 |
|> (fn name' => if name = name' then name else suffix_it name') |
|
290 |
in |
|
291 |
name |
|
292 |
|> translate_string replace_invalid |
|
293 |
|> suffix_it |
|
294 |
|> (fn name' => if name = name' then NONE else SOME name') |
|
295 |
end; |
|
296 |
||
| 18850 | 297 |
fun write_file mkdir path p = ( |
298 |
if mkdir |
|
299 |
then |
|
300 |
File.mkdir (Path.dir path) |
|
301 |
else (); |
|
302 |
File.write path (Pretty.output p ^ "\n"); |
|
303 |
p |
|
304 |
); |
|
305 |
||
306 |
fun mk_module_file postprocess_module ext path name p = |
|
307 |
let |
|
308 |
val prfx = Path.dir path; |
|
309 |
val name' = case name |
|
310 |
of "" => Path.base path |
|
311 |
| _ => (Path.ext ext o Path.unpack o implode o separate "/" o NameSpace.unpack) name; |
|
312 |
in |
|
313 |
p |
|
314 |
|> write_file true (Path.append prfx name') |
|
315 |
|> postprocess_module name |
|
316 |
end; |
|
317 |
||
| 19202 | 318 |
fun constructive_fun (name, (eqs, ty)) = |
319 |
let |
|
320 |
fun check_eq (eq as (lhs, rhs)) = |
|
321 |
if forall CodegenThingol.is_pat lhs |
|
322 |
then SOME eq |
|
323 |
else (warning ("in function " ^ quote name ^ ", throwing away one "
|
|
324 |
^ "non-executable function clause"); NONE) |
|
325 |
in case List.mapPartial check_eq eqs |
|
326 |
of [] => error ("in function " ^ quote name ^ ", no"
|
|
327 |
^ "executable function clauses found") |
|
328 |
| eqs => (name, (eqs, ty)) |
|
329 |
end; |
|
330 |
||
| 18756 | 331 |
fun parse_single_file serializer = |
| 18850 | 332 |
OuterParse.path |
333 |
>> (fn path => serializer |
|
334 |
(fn "" => write_file false path #> K NONE |
|
335 |
| _ => SOME)); |
|
336 |
||
337 |
fun parse_multi_file postprocess_module ext serializer = |
|
338 |
OuterParse.path |
|
339 |
>> (fn path => (serializer o mk_module_file postprocess_module ext) path); |
|
| 18702 | 340 |
|
| 18756 | 341 |
fun parse_internal serializer = |
342 |
OuterParse.name |
|
| 18850 | 343 |
>> (fn "-" => serializer |
344 |
(fn "" => (fn p => (use_text Context.ml_output false (Pretty.output p); NONE)) |
|
345 |
| _ => SOME) |
|
| 18756 | 346 |
| _ => Scan.fail ()); |
| 18702 | 347 |
|
| 18282 | 348 |
|
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
349 |
(* list serializer *) |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
350 |
|
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
351 |
fun pretty_list thingol_nil thingol_cons (target_pred, target_cons) = |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
352 |
let |
| 19202 | 353 |
fun dest_cons (IConst (c, _) `$ e1 `$ e2) = |
| 18850 | 354 |
if c = thingol_cons |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
355 |
then SOME (e1, e2) |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
356 |
else NONE |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
357 |
| dest_cons _ = NONE; |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
358 |
fun pretty_default fxy pr e1 e2 = |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
359 |
brackify_infix (target_pred, R) fxy [ |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
360 |
pr (INFX (target_pred, X)) e1, |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
361 |
str target_cons, |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
362 |
pr (INFX (target_pred, R)) e2 |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
363 |
]; |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
364 |
fun pretty_compact fxy pr [e1, e2] = |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
365 |
case CodegenThingol.unfoldr dest_cons e2 |
| 19202 | 366 |
of (es, IConst (c, _)) => |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
367 |
if c = thingol_nil |
| 18812 | 368 |
then Pretty.enum "," "[" "]" (map (pr NOBR) (e1::es)) |
| 18853 | 369 |
else pretty_default fxy pr e1 e2 |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
370 |
| _ => pretty_default fxy pr e1 e2; |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
371 |
in ((2, 2), pretty_compact) end; |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
372 |
|
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
373 |
|
| 18216 | 374 |
|
375 |
(** ML serializer **) |
|
376 |
||
377 |
local |
|
378 |
||
| 19150 | 379 |
val reserved_ml = ThmDatabase.ml_reserved @ [ |
380 |
"bool", "int", "list", "unit", "option", "true", "false", "not", "None", "Some", "o" |
|
381 |
]; |
|
382 |
||
383 |
structure NameMangler = NameManglerFun ( |
|
384 |
type ctxt = string list; |
|
385 |
type src = string; |
|
386 |
val ord = string_ord; |
|
387 |
fun mk reserved_ml (name, 0) = |
|
388 |
(replace_invalid o NameSpace.base) name |
|
389 |
| mk reserved_ml (name, i) = |
|
390 |
(replace_invalid o NameSpace.base) name ^ replicate_string i "'"; |
|
391 |
fun is_valid reserved_ml = not o member (op =) reserved_ml; |
|
392 |
fun maybe_unique _ _ = NONE; |
|
393 |
fun re_mangle _ dst = error ("no such definition name: " ^ quote dst);
|
|
394 |
); |
|
395 |
||
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
396 |
fun ml_expr_seri (is_cons, needs_type) (tyco_syntax, const_syntax) resolv = |
| 18216 | 397 |
let |
| 18865 | 398 |
val ml_from_label = |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
399 |
str o translate_string (fn "_" => "__" | "." => "_" | c => c) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
400 |
o NameSpace.base o resolv; |
| 19213 | 401 |
fun ml_from_tyvar (v, sort) = |
402 |
let |
|
403 |
fun mk_class v class = |
|
404 |
str (prefix "'" v ^ " " ^ resolv class); |
|
405 |
in |
|
406 |
Pretty.block [ |
|
407 |
str "(",
|
|
408 |
str v, |
|
409 |
str ":", |
|
410 |
case sort |
|
| 19253 | 411 |
of [] => str "unit" |
412 |
| [class] => mk_class v class |
|
| 19213 | 413 |
| _ => Pretty.enum " *" "" "" (map (mk_class v) sort), |
414 |
str ")" |
|
415 |
] |
|
416 |
end; |
|
|
19280
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
417 |
fun ml_from_sortlookup fxy lss = |
| 18885 | 418 |
let |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
419 |
fun from_label l = |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
420 |
Pretty.block [str "#", |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
421 |
if (is_some o Int.fromString) l then str l |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
422 |
else ml_from_label l |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
423 |
]; |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
424 |
fun from_lookup fxy [] p = p |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
425 |
| from_lookup fxy [l] p = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
426 |
brackify fxy [ |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
427 |
from_label l, |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
428 |
p |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
429 |
] |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
430 |
| from_lookup fxy ls p = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
431 |
brackify fxy [ |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
432 |
Pretty.enum " o" "(" ")" (map from_label ls),
|
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
433 |
p |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
434 |
]; |
| 18885 | 435 |
fun from_classlookup fxy (Instance (inst, lss)) = |
436 |
brackify fxy ( |
|
437 |
(str o resolv) inst |
|
438 |
:: map (ml_from_sortlookup BR) lss |
|
439 |
) |
|
440 |
| from_classlookup fxy (Lookup (classes, (v, ~1))) = |
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
441 |
from_lookup BR classes (str v) |
| 18885 | 442 |
| from_classlookup fxy (Lookup (classes, (v, i))) = |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
443 |
from_lookup BR (string_of_int (i+1) :: classes) (str v) |
|
19280
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
444 |
in case lss |
| 19253 | 445 |
of [] => str "()" |
|
19280
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
446 |
| [ls] => from_classlookup fxy ls |
|
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
447 |
| lss => (Pretty.list "(" ")" o map (from_classlookup NOBR)) lss
|
| 18885 | 448 |
end; |
| 18963 | 449 |
fun ml_from_tycoexpr fxy (tyco, tys) = |
450 |
let |
|
451 |
val tyco' = (str o resolv) tyco |
|
452 |
in case map (ml_from_type BR) tys |
|
453 |
of [] => tyco' |
|
454 |
| [p] => Pretty.block [p, Pretty.brk 1, tyco'] |
|
455 |
| (ps as _::_) => Pretty.block [Pretty.list "(" ")" ps, Pretty.brk 1, tyco']
|
|
456 |
end |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
457 |
and ml_from_type fxy (tycoexpr as tyco `%% tys) = |
| 18702 | 458 |
(case tyco_syntax tyco |
| 18963 | 459 |
of NONE => ml_from_tycoexpr fxy (tyco, tys) |
| 18702 | 460 |
| SOME ((i, k), pr) => |
461 |
if not (i <= length tys andalso length tys <= k) |
|
462 |
then error ("number of argument mismatch in customary serialization: "
|
|
| 18865 | 463 |
^ (string_of_int o length) tys ^ " given, " |
464 |
^ string_of_int i ^ " to " ^ string_of_int k |
|
| 18702 | 465 |
^ " expected") |
466 |
else pr fxy ml_from_type tys) |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
467 |
| ml_from_type fxy (t1 `-> t2) = |
| 18216 | 468 |
let |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
469 |
val brackify = gen_brackify |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
470 |
(case fxy |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
471 |
of BR => false |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
472 |
| _ => eval_fxy (INFX (1, R)) fxy) o Pretty.breaks; |
| 18216 | 473 |
in |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
474 |
brackify [ |
| 18702 | 475 |
ml_from_type (INFX (1, X)) t1, |
476 |
str "->", |
|
477 |
ml_from_type (INFX (1, R)) t2 |
|
478 |
] |
|
| 18216 | 479 |
end |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
480 |
| ml_from_type fxy (ITyVar v) = |
| 18885 | 481 |
str ("'" ^ v);
|
| 19202 | 482 |
fun typify ty p = |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
483 |
let |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
484 |
fun needs_type_t (tyco `%% tys) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
485 |
needs_type tyco |
| 19202 | 486 |
orelse exists needs_type_t tys |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
487 |
| needs_type_t (ITyVar _) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
488 |
false |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
489 |
| needs_type_t (ty1 `-> ty2) = |
| 19202 | 490 |
needs_type_t ty1 orelse needs_type_t ty2; |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
491 |
in if needs_type_t ty |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
492 |
then |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
493 |
Pretty.enclose "(" ")" [
|
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
494 |
p, |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
495 |
str ":", |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
496 |
ml_from_type NOBR ty |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
497 |
] |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
498 |
else p |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
499 |
end; |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
500 |
fun ml_from_expr fxy (e as IConst x) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
501 |
ml_from_app fxy (x, []) |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
502 |
| ml_from_expr fxy (IVar v) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
503 |
str v |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
504 |
| ml_from_expr fxy (e as e1 `$ e2) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
505 |
(case CodegenThingol.unfold_const_app e |
| 18885 | 506 |
of SOME x => ml_from_app fxy x |
| 18865 | 507 |
| NONE => |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
508 |
brackify fxy [ |
| 18885 | 509 |
ml_from_expr NOBR e1, |
510 |
ml_from_expr BR e2 |
|
| 18216 | 511 |
]) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
512 |
| ml_from_expr fxy ((v, ty) `|-> e) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
513 |
brackify BR [ |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
514 |
str "fn", |
| 19202 | 515 |
typify ty (str v), |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
516 |
str "=>", |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
517 |
ml_from_expr NOBR e |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
518 |
] |
| 19202 | 519 |
| ml_from_expr fxy (INum ((n, ty), _)) = |
| 19213 | 520 |
brackify BR [ |
| 19202 | 521 |
(str o IntInf.toString) n, |
522 |
str ":", |
|
523 |
ml_from_type NOBR ty |
|
524 |
] |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
525 |
| ml_from_expr fxy (IAbs (((ve, vty), be), _)) = |
| 19038 | 526 |
brackify BR [ |
527 |
str "fn", |
|
| 19202 | 528 |
typify vty (ml_from_expr NOBR ve), |
| 19038 | 529 |
str "=>", |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
530 |
ml_from_expr NOBR be |
| 18216 | 531 |
] |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
532 |
| ml_from_expr fxy (e as ICase ((_, [_]), _)) = |
| 18216 | 533 |
let |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
534 |
val (ves, be) = CodegenThingol.unfold_let e; |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
535 |
fun mk_val ((ve, vty), se) = Pretty.block [ |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
536 |
(Pretty.block o Pretty.breaks) [ |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
537 |
str "val", |
| 19202 | 538 |
typify vty (ml_from_expr NOBR ve), |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
539 |
str "=", |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
540 |
ml_from_expr NOBR se |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
541 |
], |
| 18702 | 542 |
str ";" |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
543 |
]; |
| 18216 | 544 |
in Pretty.chunks [ |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
545 |
[str ("let"), Pretty.fbrk, map mk_val ves |> Pretty.chunks] |> Pretty.block,
|
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
546 |
[str ("in"), Pretty.fbrk, ml_from_expr NOBR be] |> Pretty.block,
|
| 18702 | 547 |
str ("end")
|
| 18216 | 548 |
] end |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
549 |
| ml_from_expr fxy (ICase (((de, dty), bse::bses), _)) = |
| 18216 | 550 |
let |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
551 |
fun mk_clause definer (se, be) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
552 |
(Pretty.block o Pretty.breaks) [ |
| 18702 | 553 |
str definer, |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
554 |
ml_from_expr NOBR se, |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
555 |
str "=>", |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
556 |
ml_from_expr NOBR be |
| 18216 | 557 |
] |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
558 |
in brackify fxy ( |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
559 |
str "(case" |
| 19202 | 560 |
:: typify dty (ml_from_expr NOBR de) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
561 |
:: mk_clause "of" bse |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
562 |
:: map (mk_clause "|") bses |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
563 |
@ [str ")"] |
| 18216 | 564 |
) end |
| 18885 | 565 |
| ml_from_expr _ e = |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
566 |
error ("dubious expression: " ^ (Pretty.output o CodegenThingol.pretty_iexpr) e)
|
| 18885 | 567 |
and ml_mk_app f es = |
| 19136 | 568 |
if is_cons f andalso length es > 1 then |
| 19038 | 569 |
[(str o resolv) f, Pretty.enum "," "(" ")" (map (ml_from_expr BR) es)]
|
| 18702 | 570 |
else |
| 18885 | 571 |
(str o resolv) f :: map (ml_from_expr BR) es |
| 19202 | 572 |
and ml_from_app fxy ((c, (lss, ty)), es) = |
| 18885 | 573 |
case map (ml_from_sortlookup BR) lss |
574 |
of [] => |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
575 |
from_app ml_mk_app ml_from_expr const_syntax fxy ((c, ty), es) |
| 18885 | 576 |
| lss => |
577 |
brackify fxy ( |
|
578 |
(str o resolv) c |
|
579 |
:: (lss |
|
580 |
@ map (ml_from_expr BR) es) |
|
581 |
); |
|
| 19213 | 582 |
in (ml_from_label, ml_from_tyvar, ml_from_sortlookup, ml_from_tycoexpr, ml_from_type, typify, ml_from_expr) end; |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
583 |
|
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
584 |
fun ml_fun_datatyp (is_cons, needs_type) (tyco_syntax, const_syntax) resolv = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
585 |
let |
| 19213 | 586 |
val (ml_from_label, ml_from_tyvar, ml_from_sortlookup, ml_from_tycoexpr, ml_from_type, typify, ml_from_expr) = |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
587 |
ml_expr_seri (is_cons, needs_type) (tyco_syntax, const_syntax) resolv; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
588 |
fun chunk_defs ps = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
589 |
let |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
590 |
val (p_init, p_last) = split_last ps |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
591 |
in |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
592 |
Pretty.chunks (p_init @ [Pretty.block ([p_last, str ";"])]) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
593 |
end; |
| 18912 | 594 |
fun ml_from_funs (defs as def::defs_tl) = |
| 18216 | 595 |
let |
| 19213 | 596 |
fun mk_definer [] [] = "val" |
597 |
| mk_definer _ _ = "fun"; |
|
598 |
fun check_args (_, ((pats, _)::_, (sortctxt, _))) NONE = |
|
599 |
SOME (mk_definer pats sortctxt) |
|
600 |
| check_args (_, ((pats, _)::_, (sortctxt, _))) (SOME definer) = |
|
601 |
if mk_definer pats sortctxt = definer |
|
| 18216 | 602 |
then SOME definer |
| 19213 | 603 |
else error ("mixing simultaneous vals and funs not implemented");
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
604 |
fun mk_fun definer (name, (eqs as eq::eq_tl, (sortctxt, ty))) = |
| 18216 | 605 |
let |
| 19136 | 606 |
val shift = if null eq_tl then I else |
607 |
map (Pretty.block o single o Pretty.block o single); |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
608 |
fun mk_arg e ty = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
609 |
ml_from_expr BR e |
| 19202 | 610 |
|> typify ty |
| 18912 | 611 |
fun mk_eq definer (pats, expr) = |
612 |
(Pretty.block o Pretty.breaks) ( |
|
613 |
[str definer, (str o resolv) name] |
|
| 19213 | 614 |
@ (if null pats andalso null sortctxt |
| 18912 | 615 |
then [str ":", ml_from_type NOBR ty] |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
616 |
else |
| 19213 | 617 |
map ml_from_tyvar sortctxt |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
618 |
@ map2 mk_arg pats |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
619 |
((curry Library.take (length pats) o fst o CodegenThingol.unfold_fun) ty)) |
| 18912 | 620 |
@ [str "=", ml_from_expr NOBR expr] |
621 |
) |
|
| 18216 | 622 |
in |
| 18912 | 623 |
(Pretty.block o Pretty.fbreaks o shift) ( |
624 |
mk_eq definer eq |
|
625 |
:: map (mk_eq "|") eq_tl |
|
626 |
) |
|
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
627 |
end; |
| 18216 | 628 |
in |
629 |
chunk_defs ( |
|
| 19202 | 630 |
(mk_fun (the (fold check_args defs NONE)) o constructive_fun) def |
631 |
:: map (mk_fun "and" o constructive_fun) defs_tl |
|
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
632 |
) |
| 18216 | 633 |
end; |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
634 |
fun ml_from_datatypes (defs as (def::defs_tl)) = |
| 18216 | 635 |
let |
| 18702 | 636 |
fun mk_cons (co, []) = |
637 |
str (resolv co) |
|
638 |
| mk_cons (co, tys) = |
|
| 19136 | 639 |
Pretty.block [ |
640 |
str (resolv co), |
|
641 |
str " of", |
|
642 |
Pretty.brk 1, |
|
643 |
Pretty.enum " *" "" "" (map (ml_from_type NOBR) tys) |
|
644 |
] |
|
| 19038 | 645 |
fun mk_datatype definer (t, (vs, cs)) = |
| 18912 | 646 |
(Pretty.block o Pretty.breaks) ( |
| 18702 | 647 |
str definer |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
648 |
:: ml_from_tycoexpr NOBR (t, map (ITyVar o fst) vs) |
| 18912 | 649 |
:: str "=" |
650 |
:: separate (str "|") (map mk_cons cs) |
|
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
651 |
) |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
652 |
in |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
653 |
chunk_defs ( |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
654 |
mk_datatype "datatype" def |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
655 |
:: map (mk_datatype "and") defs_tl |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
656 |
) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
657 |
end; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
658 |
in (ml_from_funs, ml_from_datatypes) end; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
659 |
|
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
660 |
fun ml_from_defs (is_cons, needs_type) |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
661 |
(from_prim, (_, tyco_syntax, const_syntax)) resolver prefix defs = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
662 |
let |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
663 |
val resolv = resolver prefix; |
| 19213 | 664 |
val (ml_from_label, ml_from_tyvar, ml_from_sortlookup, ml_from_tycoexpr, ml_from_type, typify, ml_from_expr) = |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
665 |
ml_expr_seri (is_cons, needs_type) (tyco_syntax, const_syntax) resolv; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
666 |
val (ml_from_funs, ml_from_datatypes) = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
667 |
ml_fun_datatyp (is_cons, needs_type) (tyco_syntax, const_syntax) resolv; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
668 |
val filter_datatype = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
669 |
List.mapPartial |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
670 |
(fn (name, CodegenThingol.Datatype info) => SOME (name, info) |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
671 |
| (name, CodegenThingol.Datatypecons _) => NONE |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
672 |
| (name, def) => error ("datatype block containing illegal def: "
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
673 |
^ (Pretty.output o CodegenThingol.pretty_def) def)); |
| 19136 | 674 |
fun filter_class defs = |
675 |
case List.mapPartial |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
676 |
(fn (name, CodegenThingol.Class info) => SOME (name, info) |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
677 |
| (name, CodegenThingol.Classmember _) => NONE |
| 19136 | 678 |
| (name, def) => error ("class block containing illegal def: "
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
679 |
^ (Pretty.output o CodegenThingol.pretty_def) def)) defs |
| 19136 | 680 |
of [class] => class |
681 |
| _ => error ("class block without class: " ^ (commas o map (quote o fst)) defs)
|
|
682 |
fun ml_from_class (name, (supclasses, (v, membrs))) = |
|
683 |
let |
|
684 |
fun from_supclass class = |
|
685 |
Pretty.block [ |
|
686 |
ml_from_label class, |
|
687 |
str ":", |
|
688 |
Pretty.brk 1, |
|
689 |
str ("'" ^ v),
|
|
690 |
Pretty.brk 1, |
|
691 |
(str o resolv) class |
|
692 |
]; |
|
693 |
fun from_membr (m, (_, ty)) = |
|
694 |
Pretty.block [ |
|
695 |
ml_from_label m, |
|
696 |
str ":", |
|
697 |
Pretty.brk 1, |
|
698 |
ml_from_type NOBR ty |
|
699 |
]; |
|
700 |
fun from_membr_fun (m, _) = |
|
701 |
(Pretty.block o Pretty.breaks) [ |
|
702 |
str "fun", |
|
703 |
(str o resolv) m, |
|
704 |
Pretty.enclose "(" ")" [str (v ^ ":'" ^ v ^ " " ^ resolv name)],
|
|
705 |
str "=", |
|
706 |
Pretty.block [str "#", ml_from_label m], |
|
707 |
str (v ^ ";") |
|
708 |
]; |
|
709 |
in |
|
710 |
Pretty.chunks ( |
|
711 |
(Pretty.block o Pretty.breaks) [ |
|
712 |
str "type", |
|
713 |
str ("'" ^ v),
|
|
714 |
(str o resolv) name, |
|
715 |
str "=", |
|
716 |
Pretty.enum "," "{" "};" (
|
|
717 |
map from_supclass supclasses @ map from_membr membrs |
|
718 |
) |
|
719 |
] |
|
720 |
:: map from_membr_fun membrs) |
|
721 |
end |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
722 |
fun ml_from_def (name, CodegenThingol.Undef) = |
| 18702 | 723 |
error ("empty definition during serialization: " ^ quote name)
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
724 |
| ml_from_def (name, CodegenThingol.Prim prim) = |
| 18963 | 725 |
from_prim resolv (name, prim) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
726 |
| ml_from_def (name, CodegenThingol.Typesyn (vs, ty)) = |
| 18865 | 727 |
(map (fn (vname, []) => () | _ => |
728 |
error "can't serialize sort constrained type declaration to ML") vs; |
|
| 18702 | 729 |
Pretty.block [ |
730 |
str "type ", |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
731 |
ml_from_tycoexpr NOBR (name, map (ITyVar o fst) vs), |
| 18702 | 732 |
str " =", |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
733 |
Pretty.brk 1, |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
734 |
ml_from_type NOBR ty, |
| 18702 | 735 |
str ";" |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
736 |
] |
| 18702 | 737 |
) |> SOME |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
738 |
| ml_from_def (name, CodegenThingol.Classinst (((class, (tyco, arity)), suparities), memdefs)) = |
| 18865 | 739 |
let |
740 |
val definer = if null arity then "val" else "fun" |
|
| 19136 | 741 |
fun from_supclass (supclass, (supinst, lss)) = |
| 18885 | 742 |
(Pretty.block o Pretty.breaks) ( |
743 |
ml_from_label supclass |
|
744 |
:: str "=" |
|
| 19136 | 745 |
:: (str o resolv) supinst |
|
19280
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
746 |
:: (if null lss andalso (not o null) arity |
|
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
747 |
then [str "()"] |
|
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
19253
diff
changeset
|
748 |
else map (ml_from_sortlookup NOBR) lss) |
| 18885 | 749 |
); |
| 19253 | 750 |
fun from_memdef (m, ((m', def), lss)) = |
| 19213 | 751 |
(ml_from_funs [(m', def)], (Pretty.block o Pretty.breaks) ( |
| 19136 | 752 |
ml_from_label m |
753 |
:: str "=" |
|
| 19213 | 754 |
:: (str o resolv) m' |
| 19253 | 755 |
:: map (ml_from_sortlookup NOBR) lss |
| 19136 | 756 |
)); |
| 19253 | 757 |
fun mk_corp rhs = |
758 |
(Pretty.block o Pretty.breaks) ( |
|
759 |
str definer |
|
760 |
:: (str o resolv) name |
|
761 |
:: map ml_from_tyvar arity |
|
762 |
@ [str "=", rhs] |
|
763 |
); |
|
| 18865 | 764 |
fun mk_memdefs supclassexprs [] = |
765 |
Pretty.enum "," "{" "};" (
|
|
766 |
supclassexprs |
|
| 19253 | 767 |
) |> mk_corp |
| 18865 | 768 |
| mk_memdefs supclassexprs memdefs = |
769 |
let |
|
770 |
val (defs, assigns) = (split_list o map from_memdef) memdefs; |
|
771 |
in |
|
772 |
Pretty.chunks [ |
|
| 19253 | 773 |
Pretty.block [ |
774 |
str "local", |
|
775 |
Pretty.fbrk, |
|
776 |
Pretty.chunks defs |
|
777 |
], |
|
778 |
Pretty.block [str "in", Pretty.brk 1, |
|
779 |
(mk_corp o Pretty.block o Pretty.breaks) [ |
|
780 |
Pretty.enum "," "{" "}" (supclassexprs @ assigns),
|
|
781 |
str ":", |
|
782 |
ml_from_tycoexpr NOBR (class, [tyco `%% map (ITyVar o fst) arity]) |
|
783 |
] |
|
784 |
], |
|
785 |
str "end; (* instance *)" |
|
786 |
] |
|
| 18865 | 787 |
end; |
788 |
in |
|
| 19253 | 789 |
mk_memdefs (map from_supclass suparities) memdefs |> SOME |
| 19213 | 790 |
end |
791 |
| ml_from_def (name, CodegenThingol.Classinstmember) = NONE; |
|
| 18850 | 792 |
in case defs |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
793 |
of (_, CodegenThingol.Fun _)::_ => (SOME o ml_from_funs o map (fn (name, CodegenThingol.Fun info) => (name, info))) defs |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
794 |
| (_, CodegenThingol.Datatypecons _)::_ => (SOME o ml_from_datatypes o filter_datatype) defs |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
795 |
| (_, CodegenThingol.Datatype _)::_ => (SOME o ml_from_datatypes o filter_datatype) defs |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
796 |
| (_, CodegenThingol.Class _)::_ => (SOME o ml_from_class o filter_class) defs |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
797 |
| (_, CodegenThingol.Classmember _)::_ => (SOME o ml_from_class o filter_class) defs |
| 18850 | 798 |
| [def] => ml_from_def def |
| 19136 | 799 |
| defs => error ("illegal mutual dependencies: " ^ (commas o map fst) defs)
|
| 18216 | 800 |
end; |
801 |
||
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
802 |
fun ml_annotators (nsp_dtcon, nsp_class, is_int_tyco) = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
803 |
let |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
804 |
fun needs_type tyco = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
805 |
CodegenThingol.has_nsp tyco nsp_class |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
806 |
orelse is_int_tyco tyco; |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
807 |
fun is_cons c = CodegenThingol.has_nsp c nsp_dtcon; |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
808 |
in (is_cons, needs_type) end; |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
809 |
|
| 18216 | 810 |
in |
811 |
||
| 18865 | 812 |
fun ml_from_thingol target (nsp_dtcon, nsp_class, is_int_tyco) nspgrp = |
| 18216 | 813 |
let |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
814 |
fun ml_from_module resolv _ ((_, name), ps) = |
| 18756 | 815 |
Pretty.chunks ([ |
| 18702 | 816 |
str ("structure " ^ name ^ " = "),
|
817 |
str "struct", |
|
818 |
str "" |
|
819 |
] @ separate (str "") ps @ [ |
|
820 |
str "", |
|
821 |
str ("end; (* struct " ^ name ^ " *)")
|
|
| 18756 | 822 |
]); |
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
823 |
val (is_cons, needs_type) = ml_annotators (nsp_dtcon, nsp_class, is_int_tyco); |
| 18756 | 824 |
val serializer = abstract_serializer (target, nspgrp) |
| 18919 | 825 |
"ROOT" (ml_from_defs (is_cons, needs_type), ml_from_module, |
826 |
abstract_validator reserved_ml, snd); |
|
| 18756 | 827 |
fun eta_expander module const_syntax s = |
| 18702 | 828 |
case const_syntax s |
829 |
of SOME ((i, _), _) => i |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
830 |
| _ => if CodegenThingol.has_nsp s nsp_dtcon |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
831 |
then case CodegenThingol.get_def module s |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
832 |
of CodegenThingol.Datatypecons dtname => |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
833 |
case CodegenThingol.get_def module dtname |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
834 |
of CodegenThingol.Datatype (_, cs) => |
| 18702 | 835 |
let val l = AList.lookup (op =) cs s |> the |> length |
836 |
in if l >= 2 then l else 0 end |
|
837 |
else 0; |
|
| 18756 | 838 |
fun preprocess const_syntax module = |
| 18702 | 839 |
module |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
840 |
|> debug_msg (fn _ => "eta-expanding...") |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
841 |
|> CodegenThingol.eta_expand (eta_expander module const_syntax) |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
842 |
|> debug_msg (fn _ => "eta-expanding polydefs...") |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
843 |
|> CodegenThingol.eta_expand_poly |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
844 |
(*|> debug 3 (fn _ => "unclashing expression/type variables...") |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
845 |
|> CodegenThingol.unclash_vars_tvars*); |
| 18850 | 846 |
val parse_multi = |
847 |
OuterParse.name |
|
848 |
#-> (fn "dir" => |
|
849 |
parse_multi_file |
|
850 |
(K o SOME o str o suffix ";" o prefix "val _ = use " |
|
851 |
o quote o suffix ".ML" o translate_string (fn "." => "/" | s => s)) "ML" serializer |
|
852 |
| _ => Scan.fail ()); |
|
| 18282 | 853 |
in |
| 18850 | 854 |
(parse_multi |
855 |
|| parse_internal serializer |
|
856 |
|| parse_single_file serializer) |
|
| 18865 | 857 |
>> (fn seri => fn (class_syntax, tyco_syntax, const_syntax) => seri |
858 |
(preprocess const_syntax) (class_syntax, tyco_syntax, const_syntax)) |
|
| 18216 | 859 |
end; |
860 |
||
| 19150 | 861 |
fun mk_flat_ml_resolver names = |
862 |
let |
|
863 |
val mangler = |
|
864 |
NameMangler.empty |
|
865 |
|> fold_map (NameMangler.declare reserved_ml) names |
|
866 |
|-> (fn _ => I) |
|
867 |
in NameMangler.get reserved_ml mangler end; |
|
868 |
||
|
19042
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
869 |
fun ml_fun_datatype (nsp_dtcon, nsp_class, is_int_tyco) = |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
870 |
ml_fun_datatyp (ml_annotators (nsp_dtcon, nsp_class, is_int_tyco)); |
|
630b8dd0b31a
exported some interfaces useful for other code generator approaches
haftmann
parents:
19038
diff
changeset
|
871 |
|
| 18216 | 872 |
end; (* local *) |
873 |
||
| 18282 | 874 |
local |
875 |
||
| 18963 | 876 |
fun hs_from_defs with_typs (from_prim, (class_syntax, tyco_syntax, const_syntax)) |
| 19038 | 877 |
resolver prefix defs = |
| 18282 | 878 |
let |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
879 |
val resolv = resolver ""; |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
880 |
val resolv_here = resolver prefix; |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
881 |
fun hs_from_sctxt vs = |
| 18282 | 882 |
let |
| 18865 | 883 |
fun from_class cls = |
| 18919 | 884 |
class_syntax cls |
885 |
|> the_default (resolv cls) |
|
| 18702 | 886 |
fun from_sctxt [] = str "" |
| 18282 | 887 |
| from_sctxt vs = |
888 |
vs |
|
| 18919 | 889 |
|> map (fn (v, cls) => str (from_class cls ^ " " ^ v)) |
| 18812 | 890 |
|> Pretty.enum "," "(" ")"
|
| 18702 | 891 |
|> (fn p => Pretty.block [p, str " => "]) |
| 18282 | 892 |
in |
893 |
vs |
|
894 |
|> map (fn (v, sort) => map (pair v) sort) |
|
895 |
|> Library.flat |
|
896 |
|> from_sctxt |
|
897 |
end; |
|
| 18963 | 898 |
fun hs_from_tycoexpr fxy (tyco, tys) = |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
899 |
brackify fxy (str tyco :: map (hs_from_type BR) tys) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
900 |
and hs_from_type fxy (tycoexpr as tyco `%% tys) = |
| 18865 | 901 |
(case tyco_syntax tyco |
| 18335 | 902 |
of NONE => |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
903 |
hs_from_tycoexpr fxy (resolv tyco, tys) |
| 18702 | 904 |
| SOME ((i, k), pr) => |
| 18865 | 905 |
if not (i <= length tys andalso length tys <= k) |
| 18702 | 906 |
then error ("number of argument mismatch in customary serialization: "
|
| 18865 | 907 |
^ (string_of_int o length) tys ^ " given, " |
908 |
^ string_of_int i ^ " to " ^ string_of_int k |
|
| 18702 | 909 |
^ " expected") |
| 18865 | 910 |
else pr fxy hs_from_type tys) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
911 |
| hs_from_type fxy (t1 `-> t2) = |
| 18865 | 912 |
brackify_infix (1, R) fxy [ |
913 |
hs_from_type (INFX (1, X)) t1, |
|
914 |
str "->", |
|
915 |
hs_from_type (INFX (1, R)) t2 |
|
916 |
] |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
917 |
| hs_from_type fxy (ITyVar v) = |
| 18919 | 918 |
str v; |
| 18963 | 919 |
fun hs_from_sctxt_tycoexpr (sctxt, tycoexpr) = |
920 |
Pretty.block [hs_from_sctxt sctxt, hs_from_tycoexpr NOBR tycoexpr] |
|
| 18865 | 921 |
fun hs_from_sctxt_type (sctxt, ty) = |
922 |
Pretty.block [hs_from_sctxt sctxt, hs_from_type NOBR ty] |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
923 |
fun hs_from_expr fxy (e as IConst x) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
924 |
hs_from_app fxy (x, []) |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
925 |
| hs_from_expr fxy (e as (e1 `$ e2)) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
926 |
(case CodegenThingol.unfold_const_app e |
| 18865 | 927 |
of SOME x => hs_from_app fxy x |
| 18282 | 928 |
| _ => |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
929 |
brackify fxy [ |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
930 |
hs_from_expr NOBR e1, |
|
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
931 |
hs_from_expr BR e2 |
| 18282 | 932 |
]) |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
933 |
| hs_from_expr fxy (IVar v) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
934 |
(str o String.implode o nth_map 0 Char.toLower o String.explode) v |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
935 |
| hs_from_expr fxy (e as _ `|-> _) = |
| 18282 | 936 |
let |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
937 |
val (es, e) = CodegenThingol.unfold_abs e |
| 18282 | 938 |
in |
| 19038 | 939 |
brackify BR ( |
| 18702 | 940 |
str "\\" |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
941 |
:: map (hs_from_expr BR o fst) es @ [ |
| 18702 | 942 |
str "->", |
| 19038 | 943 |
hs_from_expr NOBR e |
| 18282 | 944 |
]) |
945 |
end |
|
| 19213 | 946 |
| hs_from_expr fxy (INum ((n, ty), _)) = |
947 |
brackify BR [ |
|
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
948 |
(str o (fn s => if nth_string s 0 = "~" |
|
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
949 |
then enclose "(" ")" ("negate " ^ unprefix "~" s) else s) o IntInf.toString) n,
|
| 19213 | 950 |
str "::", |
951 |
hs_from_type NOBR ty |
|
952 |
] |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
953 |
| hs_from_expr fxy (e as IAbs _) = |
| 18282 | 954 |
let |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
955 |
val (es, e) = CodegenThingol.unfold_abs e |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
956 |
in |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
957 |
brackify BR ( |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
958 |
str "\\" |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
959 |
:: map (hs_from_expr BR o fst) es @ [ |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
960 |
str "->", |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
961 |
hs_from_expr NOBR e |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
962 |
]) |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
963 |
end |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
964 |
| hs_from_expr fxy (e as ICase ((_, [_]), _)) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
965 |
let |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
966 |
val (ps, body) = CodegenThingol.unfold_let e; |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
967 |
fun mk_bind ((p, _), e) = (Pretty.block o Pretty.breaks) [ |
| 18865 | 968 |
hs_from_expr BR p, |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
969 |
str "=", |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
970 |
hs_from_expr NOBR e |
| 18282 | 971 |
]; |
972 |
in Pretty.chunks [ |
|
| 18702 | 973 |
[str ("let"), Pretty.fbrk, map mk_bind ps |> Pretty.chunks] |> Pretty.block,
|
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
974 |
[str ("in "), hs_from_expr NOBR body] |> Pretty.block
|
| 18282 | 975 |
] end |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
976 |
| hs_from_expr fxy (ICase (((de, _), bses), _)) = |
| 18282 | 977 |
let |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
978 |
fun mk_clause (se, be) = |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
979 |
(Pretty.block o Pretty.breaks) [ |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
980 |
hs_from_expr NOBR se, |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
981 |
str "->", |
|
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
982 |
hs_from_expr NOBR be |
| 18282 | 983 |
] |
| 18850 | 984 |
in Pretty.block [ |
985 |
str "case", |
|
986 |
Pretty.brk 1, |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
987 |
hs_from_expr NOBR de, |
| 18850 | 988 |
Pretty.brk 1, |
989 |
str "of", |
|
990 |
Pretty.fbrk, |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
991 |
(Pretty.chunks o map mk_clause) bses |
| 18850 | 992 |
] end |
| 18865 | 993 |
and hs_mk_app c es = |
| 18919 | 994 |
(str o resolv) c :: map (hs_from_expr BR) es |
| 19202 | 995 |
and hs_from_app fxy ((c, (ty, ls)), es) = |
| 19136 | 996 |
from_app hs_mk_app hs_from_expr const_syntax fxy ((c, ty), es); |
| 19202 | 997 |
fun hs_from_funeqs (def as (name, _)) = |
| 18865 | 998 |
let |
| 19202 | 999 |
fun from_eq (args, rhs) = |
| 18865 | 1000 |
Pretty.block [ |
| 19038 | 1001 |
(str o resolv_here) name, |
| 18865 | 1002 |
Pretty.block (map (fn p => Pretty.block [Pretty.brk 1, hs_from_expr BR p]) args), |
1003 |
Pretty.brk 1, |
|
1004 |
str ("="),
|
|
1005 |
Pretty.brk 1, |
|
1006 |
hs_from_expr NOBR rhs |
|
1007 |
] |
|
| 19202 | 1008 |
in Pretty.chunks ((map from_eq o fst o snd o constructive_fun) def) end; |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1009 |
fun hs_from_def (name, CodegenThingol.Undef) = |
| 18702 | 1010 |
error ("empty statement during serialization: " ^ quote name)
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1011 |
| hs_from_def (name, CodegenThingol.Prim prim) = |
| 19038 | 1012 |
from_prim resolv_here (name, prim) |
| 19202 | 1013 |
| hs_from_def (name, CodegenThingol.Fun (def as (_, (sctxt, ty)))) = |
| 18963 | 1014 |
let |
| 19202 | 1015 |
val body = hs_from_funeqs (name, def); |
| 18963 | 1016 |
in if with_typs then |
1017 |
Pretty.chunks [ |
|
1018 |
Pretty.block [ |
|
| 19038 | 1019 |
(str o suffix " ::" o resolv_here) name, |
| 18963 | 1020 |
Pretty.brk 1, |
1021 |
hs_from_sctxt_type (sctxt, ty) |
|
1022 |
], |
|
1023 |
body |
|
1024 |
] |> SOME |
|
1025 |
else SOME body end |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1026 |
| hs_from_def (name, CodegenThingol.Typesyn (sctxt, ty)) = |
| 18282 | 1027 |
Pretty.block [ |
| 18702 | 1028 |
str "type ", |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1029 |
hs_from_sctxt_tycoexpr (sctxt, (resolv_here name, map (ITyVar o fst) sctxt)), |
| 18702 | 1030 |
str " =", |
| 18282 | 1031 |
Pretty.brk 1, |
| 18865 | 1032 |
hs_from_sctxt_type ([], ty) |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1033 |
] |> SOME |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1034 |
| hs_from_def (name, CodegenThingol.Datatype (sctxt, constrs)) = |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1035 |
let |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1036 |
fun mk_cons (co, tys) = |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1037 |
(Pretty.block o Pretty.breaks) ( |
| 19038 | 1038 |
(str o resolv_here) co |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
1039 |
:: map (hs_from_type NOBR) tys |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1040 |
) |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1041 |
in |
| 18865 | 1042 |
Pretty.block (( |
| 18702 | 1043 |
str "data " |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1044 |
:: hs_from_sctxt_tycoexpr (sctxt, (resolv_here name, map (ITyVar o fst) sctxt)) |
| 18702 | 1045 |
:: str " =" |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1046 |
:: Pretty.brk 1 |
| 18702 | 1047 |
:: separate (Pretty.block [Pretty.brk 1, str "| "]) (map mk_cons constrs) |
| 18865 | 1048 |
) @ [ |
1049 |
Pretty.brk 1, |
|
1050 |
str "deriving Show" |
|
1051 |
]) |
|
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1052 |
end |> SOME |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1053 |
| hs_from_def (_, CodegenThingol.Datatypecons _) = |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1054 |
NONE |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1055 |
| hs_from_def (name, CodegenThingol.Class (supclasss, (v, membrs))) = |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1056 |
let |
| 18865 | 1057 |
fun mk_member (m, (sctxt, ty)) = |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1058 |
Pretty.block [ |
| 19038 | 1059 |
str (resolv_here m ^ " ::"), |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1060 |
Pretty.brk 1, |
| 18865 | 1061 |
hs_from_sctxt_type (sctxt, ty) |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1062 |
] |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1063 |
in |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1064 |
Pretty.block [ |
| 18702 | 1065 |
str "class ", |
| 19213 | 1066 |
hs_from_sctxt [(v, supclasss)], |
| 19038 | 1067 |
str (resolv_here name ^ " " ^ v), |
| 18702 | 1068 |
str " where", |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1069 |
Pretty.fbrk, |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1070 |
Pretty.chunks (map mk_member membrs) |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1071 |
] |> SOME |
|
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1072 |
end |
| 19213 | 1073 |
| hs_from_def (_, CodegenThingol.Classmember _) = |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1074 |
NONE |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1075 |
| hs_from_def (_, CodegenThingol.Classinst (((clsname, (tyco, arity)), _), memdefs)) = |
| 18385 | 1076 |
Pretty.block [ |
| 18702 | 1077 |
str "instance ", |
| 19213 | 1078 |
hs_from_sctxt arity, |
1079 |
str (resolv clsname ^ " "), |
|
1080 |
hs_from_type BR (tyco `%% map (ITyVar o fst) arity), |
|
| 18702 | 1081 |
str " where", |
| 18385 | 1082 |
Pretty.fbrk, |
| 19253 | 1083 |
Pretty.chunks (map (fn (m, ((_, (eqs, ty)), _)) => hs_from_funeqs (m, (eqs, ty))) memdefs) |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1084 |
] |> SOME |
| 19213 | 1085 |
| hs_from_def (_, CodegenThingol.Classinstmember) = |
1086 |
NONE |
|
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1087 |
in |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
1088 |
case List.mapPartial (fn (name, def) => hs_from_def (name, def)) defs |
|
18380
9668764224a7
substantial improvements for class code generation
haftmann
parents:
18361
diff
changeset
|
1089 |
of [] => NONE |
| 18702 | 1090 |
| l => (SOME o Pretty.chunks o separate (str "")) l |
| 18282 | 1091 |
end; |
1092 |
||
1093 |
in |
|
1094 |
||
| 18919 | 1095 |
fun hs_from_thingol target nsps_upper nspgrp = |
| 18282 | 1096 |
let |
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
1097 |
val reserved_hs = [ |
| 18702 | 1098 |
"hiding", "deriving", "where", "case", "of", "infix", "infixl", "infixr", |
1099 |
"import", "default", "forall", "let", "in", "class", "qualified", "data", |
|
1100 |
"newtype", "instance", "if", "then", "else", "type", "as", "do", "module" |
|
1101 |
] @ [ |
|
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1102 |
"Bool", "Integer", "Maybe", "True", "False", "Nothing", "Just", "not", "negate" |
| 18702 | 1103 |
]; |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
1104 |
fun hs_from_module resolv imps ((_, name), ps) = |
| 19038 | 1105 |
(Pretty.chunks) ( |
1106 |
str ("module " ^ name ^ " where")
|
|
1107 |
:: map (str o prefix "import qualified ") imps @ ( |
|
1108 |
str "" |
|
1109 |
:: separate (str "") ps |
|
1110 |
)); |
|
| 18919 | 1111 |
fun postproc (shallow, n) = |
1112 |
let |
|
1113 |
fun ch_first f = String.implode o nth_map 0 f o String.explode; |
|
1114 |
in if member (op =) nsps_upper shallow |
|
1115 |
then ch_first Char.toUpper n |
|
1116 |
else ch_first Char.toLower n |
|
1117 |
end; |
|
| 18963 | 1118 |
fun serializer with_typs = abstract_serializer (target, nspgrp) |
1119 |
"Main" (hs_from_defs with_typs, hs_from_module, abstract_validator reserved_hs, postproc); |
|
| 18756 | 1120 |
fun eta_expander const_syntax c = |
| 18702 | 1121 |
const_syntax c |
1122 |
|> Option.map (fst o fst) |
|
1123 |
|> the_default 0; |
|
| 18756 | 1124 |
fun preprocess const_syntax module = |
| 18702 | 1125 |
module |
|
19341
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
haftmann
parents:
19280
diff
changeset
|
1126 |
|> debug_msg (fn _ => "eta-expanding...") |
|
19167
f237c0cb3882
refined representation of codegen intermediate language
haftmann
parents:
19150
diff
changeset
|
1127 |
|> CodegenThingol.eta_expand (eta_expander const_syntax) |
| 18282 | 1128 |
in |
| 18963 | 1129 |
(Scan.optional (OuterParse.name >> (fn "no_typs" => false | s => Scan.fail_with (fn _ => "illegal flag: " ^ quote s) true)) true |
1130 |
#-> (fn with_typs => parse_multi_file ((K o K) NONE) "hs" (serializer with_typs))) |
|
1131 |
>> (fn (seri) => fn (class_syntax, tyco_syntax, const_syntax) => seri |
|
| 18865 | 1132 |
(preprocess const_syntax) (class_syntax, tyco_syntax, const_syntax)) |
| 18282 | 1133 |
end; |
1134 |
||
1135 |
end; (* local *) |
|
1136 |
||
| 18702 | 1137 |
|
1138 |
(** lookup record **) |
|
1139 |
||
1140 |
val serializers = |
|
1141 |
let |
|
1142 |
fun seri s f = (s, f s); |
|
1143 |
in {
|
|
1144 |
ml = seri "ml" ml_from_thingol, |
|
|
18704
2c86ced392a8
substantial improvement in serialization handling
haftmann
parents:
18702
diff
changeset
|
1145 |
haskell = seri "haskell" hs_from_thingol |
| 18702 | 1146 |
} end; |
1147 |
||
| 18216 | 1148 |
end; (* struct *) |