changeset 2366 | a163d2be1bb5 |
parent 2287 | 94b70aeb7d1f |
child 2383 | 4127499d9b52 |
2365:38295260a740 | 2366:a163d2be1bb5 |
---|---|
29 <-| of 'a * 'a | |
29 <-| of 'a * 'a | |
30 <-> of 'a * 'a |
30 <-> of 'a * 'a |
31 type syntax |
31 type syntax |
32 val extend_log_types: syntax -> string list -> syntax |
32 val extend_log_types: syntax -> string list -> syntax |
33 val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax |
33 val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax |
34 val extend_const_gram: syntax -> string -> (string * typ * mixfix) list -> syntax |
34 val extend_const_gram: syntax -> string * bool -> (string * typ * mixfix) list -> syntax |
35 val extend_consts: syntax -> string list -> syntax |
35 val extend_consts: syntax -> string list -> syntax |
36 val extend_trfuns: syntax -> |
36 val extend_trfuns: syntax -> |
37 (string * (ast list -> ast)) list * |
37 (string * (ast list -> ast)) list * |
38 (string * (term list -> term)) list * |
38 (string * (term list -> term)) list * |
39 (string * (term list -> term)) list * |
39 (string * (term list -> term)) list * |
55 val string_of_term: bool -> syntax -> term -> string |
55 val string_of_term: bool -> syntax -> term -> string |
56 val string_of_typ: syntax -> typ -> string |
56 val string_of_typ: syntax -> typ -> string |
57 val simple_string_of_typ: typ -> string |
57 val simple_string_of_typ: typ -> string |
58 val simple_pprint_typ: typ -> pprint_args -> unit |
58 val simple_pprint_typ: typ -> pprint_args -> unit |
59 val ambiguity_level: int ref |
59 val ambiguity_level: int ref |
60 val prtabs_of: syntax -> Printer.prtabs (* FIXME test only *) |
|
60 end; |
61 end; |
61 |
62 |
62 structure Syntax : SYNTAX = |
63 structure Syntax : SYNTAX = |
63 struct |
64 struct |
64 |
65 |
122 |
123 |
123 (** datatype syntax **) |
124 (** datatype syntax **) |
124 |
125 |
125 datatype syntax = |
126 datatype syntax = |
126 Syntax of { |
127 Syntax of { |
128 chartrans: (string * string) list, |
|
127 lexicon: lexicon, |
129 lexicon: lexicon, |
128 logtypes: string list, |
130 logtypes: string list, |
129 gram: gram, |
131 gram: gram, |
130 consts: string list, |
132 consts: string list, |
131 parse_ast_trtab: ast trtab, |
133 parse_ast_trtab: ast trtab, |
139 |
141 |
140 (* empty_syntax *) |
142 (* empty_syntax *) |
141 |
143 |
142 val empty_syntax = |
144 val empty_syntax = |
143 Syntax { |
145 Syntax { |
146 chartrans = [], |
|
144 lexicon = empty_lexicon, |
147 lexicon = empty_lexicon, |
145 logtypes = [], |
148 logtypes = [], |
146 gram = empty_gram, |
149 gram = empty_gram, |
147 consts = [], |
150 consts = [], |
148 parse_ast_trtab = empty_trtab, |
151 parse_ast_trtab = empty_trtab, |
154 prtabs = empty_prtabs}; |
157 prtabs = empty_prtabs}; |
155 |
158 |
156 |
159 |
157 (* extend_syntax *) |
160 (* extend_syntax *) |
158 |
161 |
159 fun extend_syntax prmode (Syntax tabs) syn_ext = |
162 fun extend_syntax (mode, inout) (Syntax tabs) syn_ext = |
160 let |
163 let |
161 val {lexicon, logtypes = logtypes1, gram, consts = consts1, parse_ast_trtab, |
164 val {chartrans = _, lexicon, logtypes = logtypes1, gram, consts = consts1, |
162 parse_ruletab, parse_trtab, print_trtab, print_ruletab, print_ast_trtab, |
165 parse_ast_trtab, parse_ruletab, parse_trtab, print_trtab, print_ruletab, |
163 prtabs} = tabs; |
166 print_ast_trtab, prtabs} = tabs; |
164 val SynExt {logtypes = logtypes2, xprods, consts = consts2, parse_ast_translation, |
167 val SynExt {logtypes = logtypes2, xprods, consts = consts2, parse_ast_translation, |
165 parse_rules, parse_translation, print_translation, print_rules, |
168 parse_rules, parse_translation, print_translation, print_rules, |
166 print_ast_translation} = syn_ext; |
169 print_ast_translation} = syn_ext; |
170 val prtabs' = extend_prtabs prtabs mode xprods; |
|
167 in |
171 in |
168 Syntax { |
172 Syntax { |
169 lexicon = if prmode = "" then extend_lexicon lexicon (delims_of xprods) else lexicon, |
173 chartrans = chartrans_of prtabs', |
174 lexicon = if inout then extend_lexicon lexicon (delims_of xprods) else lexicon, |
|
170 logtypes = extend_list logtypes1 logtypes2, |
175 logtypes = extend_list logtypes1 logtypes2, |
171 gram = if prmode = "" then extend_gram gram xprods else gram, |
176 gram = if inout then extend_gram gram xprods else gram, |
172 consts = consts2 union consts1, |
177 consts = consts2 union consts1, |
173 parse_ast_trtab = |
178 parse_ast_trtab = |
174 extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation", |
179 extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation", |
175 parse_ruletab = extend_ruletab parse_ruletab parse_rules, |
180 parse_ruletab = extend_ruletab parse_ruletab parse_rules, |
176 parse_trtab = extend_trtab parse_trtab parse_translation "parse translation", |
181 parse_trtab = extend_trtab parse_trtab parse_translation "parse translation", |
177 print_trtab = extend_trtab print_trtab print_translation "print translation", |
182 print_trtab = extend_trtab print_trtab print_translation "print translation", |
178 print_ruletab = extend_ruletab print_ruletab print_rules, |
183 print_ruletab = extend_ruletab print_ruletab print_rules, |
179 print_ast_trtab = |
184 print_ast_trtab = |
180 extend_trtab print_ast_trtab print_ast_translation "print ast translation", |
185 extend_trtab print_ast_trtab print_ast_translation "print ast translation", |
181 prtabs = extend_prtabs prtabs prmode xprods} |
186 prtabs = prtabs'} |
182 end; |
187 end; |
183 |
188 |
184 |
189 |
185 (* merge_syntaxes *) |
190 (* merge_syntaxes *) |
186 |
191 |
187 fun merge_syntaxes (Syntax tabs1) (Syntax tabs2) = |
192 fun merge_syntaxes (Syntax tabs1) (Syntax tabs2) = |
188 let |
193 let |
189 val {lexicon = lexicon1, logtypes = logtypes1, gram = gram1, consts = consts1, |
194 val {chartrans = _, lexicon = lexicon1, logtypes = logtypes1, gram = gram1, |
190 parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1, |
195 consts = consts1, parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1, |
191 parse_trtab = parse_trtab1, print_trtab = print_trtab1, |
196 parse_trtab = parse_trtab1, print_trtab = print_trtab1, |
192 print_ruletab = print_ruletab1, print_ast_trtab = print_ast_trtab1, |
197 print_ruletab = print_ruletab1, print_ast_trtab = print_ast_trtab1, |
193 prtabs = prtabs1} = tabs1; |
198 prtabs = prtabs1} = tabs1; |
194 |
199 |
195 val {lexicon = lexicon2, logtypes = logtypes2, gram = gram2, consts = consts2, |
200 val {chartrans = _, lexicon = lexicon2, logtypes = logtypes2, gram = gram2, |
196 parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2, |
201 consts = consts2, parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2, |
197 parse_trtab = parse_trtab2, print_trtab = print_trtab2, |
202 parse_trtab = parse_trtab2, print_trtab = print_trtab2, |
198 print_ruletab = print_ruletab2, print_ast_trtab = print_ast_trtab2, |
203 print_ruletab = print_ruletab2, print_ast_trtab = print_ast_trtab2, |
199 prtabs = prtabs2} = tabs2; |
204 prtabs = prtabs2} = tabs2; |
205 val prtabs = merge_prtabs prtabs1 prtabs2; |
|
200 in |
206 in |
201 Syntax { |
207 Syntax { |
208 chartrans = chartrans_of prtabs, |
|
202 lexicon = merge_lexicons lexicon1 lexicon2, |
209 lexicon = merge_lexicons lexicon1 lexicon2, |
203 logtypes = merge_lists logtypes1 logtypes2, |
210 logtypes = merge_lists logtypes1 logtypes2, |
204 gram = merge_grams gram1 gram2, |
211 gram = merge_grams gram1 gram2, |
205 consts = merge_lists consts1 consts2, |
212 consts = merge_lists consts1 consts2, |
206 parse_ast_trtab = |
213 parse_ast_trtab = |
209 parse_trtab = merge_trtabs parse_trtab1 parse_trtab2 "parse translation", |
216 parse_trtab = merge_trtabs parse_trtab1 parse_trtab2 "parse translation", |
210 print_trtab = merge_trtabs print_trtab1 print_trtab2 "print translation", |
217 print_trtab = merge_trtabs print_trtab1 print_trtab2 "print translation", |
211 print_ruletab = merge_ruletabs print_ruletab1 print_ruletab2, |
218 print_ruletab = merge_ruletabs print_ruletab1 print_ruletab2, |
212 print_ast_trtab = |
219 print_ast_trtab = |
213 merge_trtabs print_ast_trtab1 print_ast_trtab2 "print ast translation", |
220 merge_trtabs print_ast_trtab1 print_ast_trtab2 "print ast translation", |
214 prtabs = merge_prtabs prtabs1 prtabs2} |
221 prtabs = prtabs} |
215 end; |
222 end; |
216 |
223 |
217 |
224 |
218 (* type_syn *) |
225 (* type_syn *) |
219 |
226 |
220 val type_syn = extend_syntax "" empty_syntax type_ext; |
227 val type_syn = extend_syntax ("", true) empty_syntax type_ext; |
221 val pure_syn = extend_syntax "" type_syn pure_ext; |
228 val pure_syn = extend_syntax ("", true) type_syn pure_ext; |
222 |
229 |
223 |
230 |
224 (** inspect syntax **) |
231 (** inspect syntax **) |
225 |
232 |
226 fun pretty_strs_qs name strs = |
233 fun pretty_strs_qs name strs = |
229 |
236 |
230 (* print_gram *) |
237 (* print_gram *) |
231 |
238 |
232 fun print_gram (Syntax tabs) = |
239 fun print_gram (Syntax tabs) = |
233 let |
240 let |
234 val {lexicon, logtypes, gram, prtabs, ...} = tabs; |
241 val pretty_chartrans = |
235 in |
242 map (fn (c, s) => Pretty.str (c ^ " -> " ^ quote s)); |
243 |
|
244 val {chartrans, lexicon, logtypes, gram, prtabs, ...} = tabs; |
|
245 in |
|
246 Pretty.writeln (Pretty.big_list "chartrans:" (pretty_chartrans chartrans)); |
|
236 Pretty.writeln (pretty_strs_qs "lexicon:" (dest_lexicon lexicon)); |
247 Pretty.writeln (pretty_strs_qs "lexicon:" (dest_lexicon lexicon)); |
237 Pretty.writeln (Pretty.strs ("logtypes:" :: logtypes)); |
248 Pretty.writeln (Pretty.strs ("logtypes:" :: logtypes)); |
238 Pretty.writeln (Pretty.big_list "prods:" (pretty_gram gram)); |
249 Pretty.writeln (Pretty.big_list "prods:" (pretty_gram gram)); |
239 Pretty.writeln (pretty_strs_qs "printer modes:" (prmodes_of prtabs)) |
250 Pretty.writeln (pretty_strs_qs "printer modes:" (prmodes_of prtabs)) |
240 end; |
251 end; |
275 |
286 |
276 fun test_read (Syntax tabs) root str = |
287 fun test_read (Syntax tabs) root str = |
277 let |
288 let |
278 val {lexicon, gram, parse_ast_trtab, parse_ruletab, ...} = tabs; |
289 val {lexicon, gram, parse_ast_trtab, parse_ruletab, ...} = tabs; |
279 |
290 |
280 val toks = tokenize lexicon false str; |
291 val chars = SymbolFont.read_charnames (explode str); |
292 val toks = tokenize lexicon false chars; |
|
281 val _ = writeln ("tokens: " ^ space_implode " " (map display_token toks)); |
293 val _ = writeln ("tokens: " ^ space_implode " " (map display_token toks)); |
282 |
294 |
283 fun show_pt pt = |
295 fun show_pt pt = |
284 let |
296 let |
285 val raw_ast = pt_to_ast (K None) pt; |
297 val raw_ast = pt_to_ast (K None) pt; |
298 |
310 |
299 fun read_asts (Syntax tabs) xids root str = |
311 fun read_asts (Syntax tabs) xids root str = |
300 let |
312 let |
301 val {lexicon, gram, parse_ast_trtab, logtypes, ...} = tabs; |
313 val {lexicon, gram, parse_ast_trtab, logtypes, ...} = tabs; |
302 val root' = if root mem logtypes then logic else root; |
314 val root' = if root mem logtypes then logic else root; |
303 val pts = parse gram root' (tokenize lexicon xids str); |
315 val chars = SymbolFont.read_charnames (explode str); |
316 val pts = parse gram root' (tokenize lexicon xids chars); |
|
304 |
317 |
305 fun show_pt pt = writeln (str_of_ast (pt_to_ast (K None) pt)); |
318 fun show_pt pt = writeln (str_of_ast (pt_to_ast (K None) pt)); |
306 in |
319 in |
307 if length pts > ! ambiguity_level then |
320 if length pts > ! ambiguity_level then |
308 (warning ("Ambiguous input " ^ quote str); |
321 (warning ("Ambiguous input " ^ quote str); |
417 fun ext_syntax mk_syn_ext prmode (syn as Syntax {logtypes, ...}) decls = |
430 fun ext_syntax mk_syn_ext prmode (syn as Syntax {logtypes, ...}) decls = |
418 extend_syntax prmode syn (mk_syn_ext logtypes decls); |
431 extend_syntax prmode syn (mk_syn_ext logtypes decls); |
419 |
432 |
420 |
433 |
421 fun extend_log_types syn logtypes = |
434 fun extend_log_types syn logtypes = |
422 extend_syntax "" syn (syn_ext_logtypes logtypes); |
435 extend_syntax ("", true) syn (syn_ext_logtypes logtypes); |
423 |
436 |
424 val extend_type_gram = ext_syntax syn_ext_types ""; |
437 val extend_type_gram = ext_syntax syn_ext_types ("", true); |
425 |
438 |
426 fun extend_const_gram syn prmode = ext_syntax syn_ext_consts prmode syn; |
439 fun extend_const_gram syn prmode = ext_syntax syn_ext_consts prmode syn; |
427 |
440 |
428 val extend_consts = ext_syntax syn_ext_const_names ""; |
441 val extend_consts = ext_syntax syn_ext_const_names ("", true); |
429 |
442 |
430 val extend_trfuns = ext_syntax syn_ext_trfuns ""; |
443 val extend_trfuns = ext_syntax syn_ext_trfuns ("", true); |
431 |
444 |
432 fun extend_trrules syn rules = |
445 fun extend_trrules syn rules = |
433 ext_syntax syn_ext_rules "" syn (prep_rules (read_pattern syn) rules); |
446 ext_syntax syn_ext_rules ("", true) syn (prep_rules (read_pattern syn) rules); |
434 |
447 |
435 fun extend_trrules_i syn rules = |
448 fun extend_trrules_i syn rules = |
436 ext_syntax syn_ext_rules "" syn (prep_rules I rules); |
449 ext_syntax syn_ext_rules ("", true) syn (prep_rules I rules); |
450 |
|
451 |
|
452 |
|
453 (* FIXME test only *) |
|
454 |
|
455 fun prtabs_of (Syntax {prtabs, ...}) = prtabs; |
|
437 |
456 |
438 end; |
457 end; |