3 Author: Tobias Nipkow and Markus Wenzel, TU Muenchen |
3 Author: Tobias Nipkow and Markus Wenzel, TU Muenchen |
4 |
4 |
5 Root of Isabelle's syntax module. |
5 Root of Isabelle's syntax module. |
6 *) |
6 *) |
7 |
7 |
|
8 infix |-> <-| <->; |
|
9 |
8 signature BASIC_SYNTAX = |
10 signature BASIC_SYNTAX = |
9 sig |
11 sig |
10 include AST0 |
12 include AST0 |
11 include SEXTENSION0 |
13 include SYN_TRANS0 |
12 (* include MIXFIX0 *) (* FIXME *) |
14 include MIXFIX0 |
13 include PRINTER0 |
15 include PRINTER0 |
|
16 datatype xrule = |
|
17 op |-> of (string * string) * (string * string) | |
|
18 op <-| of (string * string) * (string * string) | |
|
19 op <-> of (string * string) * (string * string) |
14 end; |
20 end; |
15 |
21 |
16 signature SYNTAX = |
22 signature SYNTAX = |
17 sig |
23 sig |
18 include AST1 |
24 include AST1 |
19 include LEXICON0 |
25 include LEXICON0 |
20 include SYN_EXT0 |
26 include SYN_EXT0 |
21 include TYPE_EXT0 |
27 include TYPE_EXT0 |
22 include SEXTENSION1 |
28 include SYN_TRANS1 |
|
29 include MIXFIX1 |
23 include PRINTER0 |
30 include PRINTER0 |
24 sharing type ast = Parser.SynExt.Ast.ast |
31 sharing type ast = Parser.SynExt.Ast.ast |
25 structure Mixfix: MIXFIX |
32 datatype xrule = |
26 local open Mixfix in (* FIXME *) |
33 op |-> of (string * string) * (string * string) | |
27 type syntax |
34 op <-| of (string * string) * (string * string) | |
28 val extend_log_types: syntax -> string list -> syntax |
35 op <-> of (string * string) * (string * string) |
29 val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax |
36 type syntax |
30 val extend_const_gram: syntax -> (string * typ * mixfix) list -> syntax |
37 val extend_log_types: syntax -> string list -> syntax |
31 val extend_consts: syntax -> string list -> syntax |
38 val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax |
32 val extend_trfuns: syntax -> |
39 val extend_const_gram: syntax -> (string * typ * mixfix) list -> syntax |
33 (string * (ast list -> ast)) list * |
40 val extend_consts: syntax -> string list -> syntax |
34 (string * (term list -> term)) list * |
41 val extend_trfuns: syntax -> |
35 (string * (term list -> term)) list * |
42 (string * (ast list -> ast)) list * |
36 (string * (ast list -> ast)) list -> syntax |
43 (string * (term list -> term)) list * |
37 val extend_trrules: syntax -> xrule list -> syntax |
44 (string * (term list -> term)) list * |
38 end (* FIXME *) |
45 (string * (ast list -> ast)) list -> syntax |
39 val extend: syntax -> (string -> typ) -> string list * string list * sext |
46 val extend_trrules: syntax -> xrule list -> syntax |
40 -> syntax (* FIXME *) |
47 val merge_syntaxes: syntax -> syntax -> syntax |
41 val merge_syntaxes: syntax -> syntax -> syntax |
48 val type_syn: syntax |
42 val type_syn: syntax |
49 val print_gram: syntax -> unit |
43 val print_gram: syntax -> unit |
50 val print_trans: syntax -> unit |
44 val print_trans: syntax -> unit |
51 val print_syntax: syntax -> unit |
45 val print_syntax: syntax -> unit |
52 val test_read: syntax -> string -> string -> unit |
46 val test_read: syntax -> string -> string -> unit |
53 val read: syntax -> typ -> string -> term |
47 val read: syntax -> typ -> string -> term |
54 val read_typ: syntax -> (indexname -> sort) -> string -> typ |
48 val read_typ: syntax -> (indexname -> sort) -> string -> typ |
55 val simple_read_typ: string -> typ |
49 val simple_read_typ: string -> typ |
56 val pretty_term: syntax -> term -> Pretty.T |
50 val pretty_term: syntax -> term -> Pretty.T |
57 val pretty_typ: syntax -> typ -> Pretty.T |
51 val pretty_typ: syntax -> typ -> Pretty.T |
58 val string_of_term: syntax -> term -> string |
52 val string_of_term: syntax -> term -> string |
59 val string_of_typ: syntax -> typ -> string |
53 val string_of_typ: syntax -> typ -> string |
60 val simple_string_of_typ: typ -> string |
54 val simple_string_of_typ: typ -> string |
61 val simple_pprint_typ: typ -> pprint_args -> unit |
55 val simple_pprint_typ: typ -> pprint_args -> unit |
|
56 |
|
57 end; |
62 end; |
58 |
63 |
59 functor SyntaxFun(structure Symtab: SYMTAB and TypeExt: TYPE_EXT |
64 functor SyntaxFun(structure Symtab: SYMTAB and TypeExt: TYPE_EXT |
60 and SExtension: SEXTENSION and Mixfix: MIXFIX and Printer: PRINTER |
65 and SynTrans: SYN_TRANS and Mixfix: MIXFIX and Printer: PRINTER |
61 sharing Mixfix.SynExt = SExtension.Parser.SynExt = TypeExt.SynExt = Printer.SynExt) |
66 sharing Mixfix.SynExt = SynTrans.Parser.SynExt = TypeExt.SynExt = Printer.SynExt) |
62 : SYNTAX = |
67 : SYNTAX = |
63 struct |
68 struct |
64 |
69 |
65 structure SynExt = TypeExt.SynExt; |
70 structure SynExt = TypeExt.SynExt; |
66 structure Parser = SExtension.Parser; |
71 structure Parser = SynTrans.Parser; |
67 structure Lexicon = Parser.Lexicon; |
72 structure Lexicon = Parser.Lexicon; |
68 structure Mixfix = Mixfix; |
73 open Lexicon SynExt SynExt.Ast Parser TypeExt SynTrans Mixfix Printer; |
69 open Lexicon SynExt SynExt.Ast Parser TypeExt SExtension Printer; |
|
70 |
74 |
71 |
75 |
72 (** tables of translation functions **) |
76 (** tables of translation functions **) |
73 |
77 |
74 (*the ref serves as unique id*) |
78 (*the ref serves as unique id*) |
170 print_ast_translation} = syn_ext; |
174 print_ast_translation} = syn_ext; |
171 in |
175 in |
172 Syntax { |
176 Syntax { |
173 lexicon = extend_lexicon lexicon (delims_of xprods), |
177 lexicon = extend_lexicon lexicon (delims_of xprods), |
174 roots = extend_list roots1 roots2, |
178 roots = extend_list roots1 roots2, |
175 gram = extend_gram gram roots2 xprods, |
179 gram = extend_gram gram xprods, |
176 consts = consts2 union consts1, |
180 consts = consts2 union consts1, |
177 parse_ast_trtab = |
181 parse_ast_trtab = |
178 extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation", |
182 extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation", |
179 parse_ruletab = extend_ruletab parse_ruletab parse_rules, |
183 parse_ruletab = extend_ruletab parse_ruletab parse_rules, |
180 parse_trtab = extend_trtab parse_trtab parse_translation "parse translation", |
184 parse_trtab = extend_trtab parse_trtab parse_translation "parse translation", |
397 |
412 |
398 |
413 |
399 |
414 |
400 (** extend syntax (external interfaces) **) |
415 (** extend syntax (external interfaces) **) |
401 |
416 |
402 (* FIXME -> syn_ext.ML *) |
|
403 fun syn_ext_const_names roots cs = |
|
404 syn_ext roots [] [] cs ([], [], [], []) ([], []); |
|
405 |
|
406 (* FIXME -> syn_ext.ML *) |
|
407 fun syn_ext_trfuns roots trfuns = |
|
408 syn_ext roots [] [] [] trfuns ([], []); |
|
409 |
|
410 |
|
411 fun ext_syntax mk_syn_ext (syn as Syntax {roots, ...}) decls = |
417 fun ext_syntax mk_syn_ext (syn as Syntax {roots, ...}) decls = |
412 extend_syntax syn (mk_syn_ext roots decls); |
418 extend_syntax syn (mk_syn_ext roots decls); |
413 |
419 |
414 |
420 |
415 fun extend_log_types (syn as Syntax {roots, ...}) all_roots = |
421 fun extend_log_types (syn as Syntax {roots, ...}) all_roots = |
416 extend_syntax syn (syn_ext_roots all_roots (all_roots \\ roots)); |
422 extend_syntax syn (syn_ext_roots all_roots (all_roots \\ roots)); |
417 |
423 |
418 val extend_type_gram = ext_syntax Mixfix.syn_ext_types; |
424 val extend_type_gram = ext_syntax syn_ext_types; |
419 |
425 |
420 val extend_const_gram = ext_syntax Mixfix.syn_ext_consts; |
426 val extend_const_gram = ext_syntax syn_ext_consts; |
421 |
427 |
422 val extend_consts = ext_syntax syn_ext_const_names; |
428 val extend_consts = ext_syntax syn_ext_const_names; |
423 |
429 |
424 val extend_trfuns = ext_syntax syn_ext_trfuns; |
430 val extend_trfuns = ext_syntax syn_ext_trfuns; |
425 |
431 |
426 fun extend_trrules syn xrules = |
432 fun extend_trrules syn xrules = |
427 ext_syntax syn_ext_rules syn (read_xrules syn xrules); |
433 ext_syntax syn_ext_rules syn (read_xrules syn xrules); |
428 |
434 |
429 |
435 |
430 (* extend *) (* FIXME remove *) |
|
431 |
|
432 fun extend syn0 read_ty (all_roots, xconsts, sext) = |
|
433 let |
|
434 val Syntax {roots, ...} = syn0; |
|
435 |
|
436 val syn1 = extend_syntax syn0 |
|
437 (syn_ext_of_sext all_roots (all_roots \\ roots) xconsts read_ty sext); |
|
438 |
|
439 val syn2 = extend_syntax syn1 |
|
440 (syn_ext_rules all_roots (read_xrules syn1 (xrules_of sext))); |
|
441 in syn2 end; |
|
442 |
|
443 |
|
444 end; |
436 end; |
445 |
437 |