src/Pure/Syntax/syntax.ML
changeset 764 b60e77395d1a
parent 624 33b9b5da3e6f
child 865 b38c67991122
equal deleted inserted replaced
763:d5a626aacdd3 764:b60e77395d1a
    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
   132 (** datatype syntax **)
   133 (** datatype syntax **)
   133 
   134 
   134 datatype syntax =
   135 datatype syntax =
   135   Syntax of {
   136   Syntax of {
   136     lexicon: lexicon,
   137     lexicon: lexicon,
   137     roots: string list,
   138     logtypes: string list,
   138     gram: gram,
   139     gram: gram,
   139     consts: string list,
   140     consts: string list,
   140     parse_ast_trtab: ast trtab,
   141     parse_ast_trtab: ast trtab,
   141     parse_ruletab: ruletab,
   142     parse_ruletab: ruletab,
   142     parse_trtab: term trtab,
   143     parse_trtab: term trtab,
   149 (* empty_syntax *)
   150 (* empty_syntax *)
   150 
   151 
   151 val empty_syntax =
   152 val empty_syntax =
   152   Syntax {
   153   Syntax {
   153     lexicon = empty_lexicon,
   154     lexicon = empty_lexicon,
   154     roots = [],
   155     logtypes = [],
   155     gram = empty_gram,
   156     gram = empty_gram,
   156     consts = [],
   157     consts = [],
   157     parse_ast_trtab = empty_trtab,
   158     parse_ast_trtab = empty_trtab,
   158     parse_ruletab = empty_ruletab,
   159     parse_ruletab = empty_ruletab,
   159     parse_trtab = empty_trtab,
   160     parse_trtab = empty_trtab,
   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,
   225 
   226 
   226 
   227 
   227 (* type_syn *)
   228 (* type_syn *)
   228 
   229 
   229 val type_syn = extend_syntax empty_syntax type_ext;
   230 val type_syn = extend_syntax empty_syntax type_ext;
   230 
   231 val pure_syn = extend_syntax type_syn pure_ext;
   231 
   232 
   232 
   233 
   233 (** inspect syntax **)
   234 (** inspect syntax **)
   234 
   235 
   235 fun pretty_strs_qs name strs =
   236 fun pretty_strs_qs name strs =
   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