45 (string * (ast list -> ast)) list -> syntax |
45 (string * (ast list -> ast)) list -> syntax |
46 val extend_trrules: syntax -> |
46 val extend_trrules: syntax -> |
47 (bool -> term list * typ -> int * term * 'a) -> xrule list -> syntax |
47 (bool -> term list * typ -> int * term * 'a) -> xrule list -> syntax |
48 val merge_syntaxes: syntax -> syntax -> syntax |
48 val merge_syntaxes: syntax -> syntax -> syntax |
49 val type_syn: syntax |
49 val type_syn: syntax |
|
50 val pure_syn: syntax |
50 val print_gram: syntax -> unit |
51 val print_gram: syntax -> unit |
51 val print_trans: syntax -> unit |
52 val print_trans: syntax -> unit |
52 val print_syntax: syntax -> unit |
53 val print_syntax: syntax -> unit |
53 val test_read: syntax -> string -> string -> unit |
54 val test_read: syntax -> string -> string -> unit |
54 val read: syntax -> typ -> string -> term list |
55 val read: syntax -> typ -> string -> term list |
165 |
166 |
166 (* extend_syntax *) |
167 (* extend_syntax *) |
167 |
168 |
168 fun extend_syntax (Syntax tabs) syn_ext = |
169 fun extend_syntax (Syntax tabs) syn_ext = |
169 let |
170 let |
170 val {lexicon, roots = roots1, gram, consts = consts1, parse_ast_trtab, |
171 val {lexicon, logtypes = logtypes1, gram, consts = consts1, parse_ast_trtab, |
171 parse_ruletab, parse_trtab, print_trtab, print_ruletab, print_ast_trtab, |
172 parse_ruletab, parse_trtab, print_trtab, print_ruletab, print_ast_trtab, |
172 prtab} = tabs; |
173 prtab} = tabs; |
173 val SynExt {roots = roots2, xprods, consts = consts2, parse_ast_translation, |
174 val SynExt {logtypes = logtypes2, xprods, consts = consts2, parse_ast_translation, |
174 parse_rules, parse_translation, print_translation, print_rules, |
175 parse_rules, parse_translation, print_translation, print_rules, |
175 print_ast_translation} = syn_ext; |
176 print_ast_translation} = syn_ext; |
176 in |
177 in |
177 Syntax { |
178 Syntax { |
178 lexicon = extend_lexicon lexicon (delims_of xprods), |
179 lexicon = extend_lexicon lexicon (delims_of xprods), |
179 roots = extend_list roots1 roots2, |
180 logtypes = extend_list logtypes1 logtypes2, |
180 gram = extend_gram gram (roots1 @ roots2) xprods, |
181 gram = extend_gram gram (logtypes1 @ logtypes2) xprods, |
181 consts = consts2 union consts1, |
182 consts = consts2 union consts1, |
182 parse_ast_trtab = |
183 parse_ast_trtab = |
183 extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation", |
184 extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation", |
184 parse_ruletab = extend_ruletab parse_ruletab parse_rules, |
185 parse_ruletab = extend_ruletab parse_ruletab parse_rules, |
185 parse_trtab = extend_trtab parse_trtab parse_translation "parse translation", |
186 parse_trtab = extend_trtab parse_trtab parse_translation "parse translation", |
193 |
194 |
194 (* merge_syntaxes *) |
195 (* merge_syntaxes *) |
195 |
196 |
196 fun merge_syntaxes (Syntax tabs1) (Syntax tabs2) = |
197 fun merge_syntaxes (Syntax tabs1) (Syntax tabs2) = |
197 let |
198 let |
198 val {lexicon = lexicon1, roots = roots1, gram = gram1, consts = consts1, |
199 val {lexicon = lexicon1, logtypes = logtypes1, gram = gram1, consts = consts1, |
199 parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1, |
200 parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1, |
200 parse_trtab = parse_trtab1, print_trtab = print_trtab1, |
201 parse_trtab = parse_trtab1, print_trtab = print_trtab1, |
201 print_ruletab = print_ruletab1, print_ast_trtab = print_ast_trtab1, |
202 print_ruletab = print_ruletab1, print_ast_trtab = print_ast_trtab1, |
202 prtab = prtab1} = tabs1; |
203 prtab = prtab1} = tabs1; |
203 |
204 |
204 val {lexicon = lexicon2, roots = roots2, gram = gram2, consts = consts2, |
205 val {lexicon = lexicon2, logtypes = logtypes2, gram = gram2, consts = consts2, |
205 parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2, |
206 parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2, |
206 parse_trtab = parse_trtab2, print_trtab = print_trtab2, |
207 parse_trtab = parse_trtab2, print_trtab = print_trtab2, |
207 print_ruletab = print_ruletab2, print_ast_trtab = print_ast_trtab2, |
208 print_ruletab = print_ruletab2, print_ast_trtab = print_ast_trtab2, |
208 prtab = prtab2} = tabs2; |
209 prtab = prtab2} = tabs2; |
209 in |
210 in |
210 Syntax { |
211 Syntax { |
211 lexicon = merge_lexicons lexicon1 lexicon2, |
212 lexicon = merge_lexicons lexicon1 lexicon2, |
212 roots = merge_lists roots1 roots2, |
213 logtypes = merge_lists logtypes1 logtypes2, |
213 gram = merge_grams gram1 gram2, |
214 gram = merge_grams gram1 gram2, |
214 consts = merge_lists consts1 consts2, |
215 consts = merge_lists consts1 consts2, |
215 parse_ast_trtab = |
216 parse_ast_trtab = |
216 merge_trtabs parse_ast_trtab1 parse_ast_trtab2 "parse ast translation", |
217 merge_trtabs parse_ast_trtab1 parse_ast_trtab2 "parse ast translation", |
217 parse_ruletab = merge_ruletabs parse_ruletab1 parse_ruletab2, |
218 parse_ruletab = merge_ruletabs parse_ruletab1 parse_ruletab2, |
238 |
239 |
239 (* print_gram *) |
240 (* print_gram *) |
240 |
241 |
241 fun print_gram (Syntax tabs) = |
242 fun print_gram (Syntax tabs) = |
242 let |
243 let |
243 val {lexicon, roots, gram, ...} = tabs; |
244 val {lexicon, logtypes, gram, ...} = tabs; |
244 in |
245 in |
245 Pretty.writeln (pretty_strs_qs "lexicon:" (dest_lexicon lexicon)); |
246 Pretty.writeln (pretty_strs_qs "lexicon:" (dest_lexicon lexicon)); |
246 Pretty.writeln (Pretty.strs ("roots:" :: roots)); |
247 Pretty.writeln (Pretty.strs ("logtypes:" :: logtypes)); |
247 Pretty.writeln (Pretty.big_list "prods:" (pretty_gram gram)) |
248 Pretty.writeln (Pretty.big_list "prods:" (pretty_gram gram)) |
248 end; |
249 end; |
249 |
250 |
250 |
251 |
251 (* print_trans *) |
252 (* print_trans *) |
302 |
303 |
303 (* read_ast *) |
304 (* read_ast *) |
304 |
305 |
305 fun read_asts (Syntax tabs) print_msg xids root str = |
306 fun read_asts (Syntax tabs) print_msg xids root str = |
306 let |
307 let |
307 val {lexicon, gram, parse_ast_trtab, roots, ...} = tabs; |
308 val {lexicon, gram, parse_ast_trtab, logtypes, ...} = tabs; |
308 val root' = if root mem (roots \\ ["type", "prop"]) then "@logic_H" |
309 val root' = if root mem logtypes then logic else root; |
309 else if root = "prop" then "@prop_H" else root; |
|
310 val pts = parse gram root' (tokenize lexicon xids str); |
310 val pts = parse gram root' (tokenize lexicon xids str); |
311 |
311 |
312 fun show_pt pt = writeln (str_of_ast (pt_to_ast (K None) pt)); |
312 fun show_pt pt = writeln (str_of_ast (pt_to_ast (K None) pt)); |
313 in |
313 in |
314 if print_msg andalso length pts > 1 then |
314 if print_msg andalso length pts > 1 then |
434 |
434 |
435 |
435 |
436 |
436 |
437 (** extend syntax (external interfaces) **) |
437 (** extend syntax (external interfaces) **) |
438 |
438 |
439 fun ext_syntax mk_syn_ext (syn as Syntax {roots, ...}) decls = |
439 fun ext_syntax mk_syn_ext (syn as Syntax {logtypes, ...}) decls = |
440 extend_syntax syn (mk_syn_ext roots decls); |
440 extend_syntax syn (mk_syn_ext logtypes decls); |
441 |
441 |
442 |
442 |
443 fun extend_log_types (syn as Syntax {roots, ...}) all_roots = |
443 fun extend_log_types syn logtypes = |
444 extend_syntax syn (syn_ext_roots all_roots (all_roots \\ roots)); |
444 extend_syntax syn (syn_ext_logtypes logtypes); |
445 |
445 |
446 val extend_type_gram = ext_syntax syn_ext_types; |
446 val extend_type_gram = ext_syntax syn_ext_types; |
447 |
447 |
448 val extend_const_gram = ext_syntax syn_ext_consts; |
448 val extend_const_gram = ext_syntax syn_ext_consts; |
449 |
449 |