src/Pure/Syntax/syn_ext.ML
changeset 42268 01401287c3f7
parent 42267 9566078ad905
equal deleted inserted replaced
42267:9566078ad905 42268:01401287c3f7
    39   val delims_of: xprod list -> string list list
    39   val delims_of: xprod list -> string list list
    40   datatype syn_ext =
    40   datatype syn_ext =
    41     Syn_Ext of {
    41     Syn_Ext of {
    42       xprods: xprod list,
    42       xprods: xprod list,
    43       consts: string list,
    43       consts: string list,
    44       prmodes: string list,
       
    45       parse_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list,
    44       parse_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list,
    46       parse_rules: (Ast.ast * Ast.ast) list,
    45       parse_rules: (Ast.ast * Ast.ast) list,
    47       parse_translation: (string * ((Proof.context -> term list -> term) * stamp)) list,
    46       parse_translation: (string * ((Proof.context -> term list -> term) * stamp)) list,
    48       print_translation: (string * ((Proof.context -> typ -> term list -> term) * stamp)) list,
    47       print_translation: (string * ((Proof.context -> typ -> term list -> term) * stamp)) list,
    49       print_rules: (Ast.ast * Ast.ast) list,
    48       print_rules: (Ast.ast * Ast.ast) list,
    50       print_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list,
    49       print_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list}
    51       token_translation: (string * string * (Proof.context -> string -> Pretty.T)) list}
       
    52   val mfix_delims: string -> string list
    50   val mfix_delims: string -> string list
    53   val mfix_args: string -> int
    51   val mfix_args: string -> int
    54   val syn_ext': bool -> (string -> bool) -> mfix list ->
    52   val syn_ext': bool -> (string -> bool) -> mfix list ->
    55     string list -> (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
    53     string list -> (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
    56     (string * ((Proof.context -> term list -> term) * stamp)) list *
    54     (string * ((Proof.context -> term list -> term) * stamp)) list *
    57     (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
    55     (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
    58     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list
    56     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list ->
    59     -> (string * string * (Proof.context -> string -> Pretty.T)) list
    57     (Ast.ast * Ast.ast) list * (Ast.ast * Ast.ast) list -> syn_ext
    60     -> (Ast.ast * Ast.ast) list * (Ast.ast * Ast.ast) list -> syn_ext
       
    61   val syn_ext: mfix list -> string list ->
    58   val syn_ext: mfix list -> string list ->
    62     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
    59     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
    63     (string * ((Proof.context -> term list -> term) * stamp)) list *
    60     (string * ((Proof.context -> term list -> term) * stamp)) list *
    64     (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
    61     (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
    65     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list
    62     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list ->
    66     -> (string * string * (Proof.context -> string -> Pretty.T)) list
    63     (Ast.ast * Ast.ast) list * (Ast.ast * Ast.ast) list -> syn_ext
    67     -> (Ast.ast * Ast.ast) list * (Ast.ast * Ast.ast) list -> syn_ext
       
    68   val syn_ext_const_names: string list -> syn_ext
    64   val syn_ext_const_names: string list -> syn_ext
    69   val syn_ext_rules: (Ast.ast * Ast.ast) list * (Ast.ast * Ast.ast) list -> syn_ext
    65   val syn_ext_rules: (Ast.ast * Ast.ast) list * (Ast.ast * Ast.ast) list -> syn_ext
    70   val syn_ext_trfuns:
    66   val syn_ext_trfuns:
    71     (string * ((Ast.ast list -> Ast.ast) * stamp)) list *
    67     (string * ((Ast.ast list -> Ast.ast) * stamp)) list *
    72     (string * ((term list -> term) * stamp)) list *
    68     (string * ((term list -> term) * stamp)) list *
    75   val syn_ext_advanced_trfuns:
    71   val syn_ext_advanced_trfuns:
    76     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
    72     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
    77     (string * ((Proof.context -> term list -> term) * stamp)) list *
    73     (string * ((Proof.context -> term list -> term) * stamp)) list *
    78     (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
    74     (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
    79     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list -> syn_ext
    75     (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list -> syn_ext
    80   val syn_ext_tokentrfuns: (string * string * (Proof.context -> string -> Pretty.T)) list -> syn_ext
       
    81   val pure_ext: syn_ext
    76   val pure_ext: syn_ext
    82 end;
    77 end;
    83 
    78 
    84 structure Syn_Ext: SYN_EXT =
    79 structure Syn_Ext: SYN_EXT =
    85 struct
    80 struct
   324 
   319 
   325 datatype syn_ext =
   320 datatype syn_ext =
   326   Syn_Ext of {
   321   Syn_Ext of {
   327     xprods: xprod list,
   322     xprods: xprod list,
   328     consts: string list,
   323     consts: string list,
   329     prmodes: string list,
       
   330     parse_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list,
   324     parse_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list,
   331     parse_rules: (Ast.ast * Ast.ast) list,
   325     parse_rules: (Ast.ast * Ast.ast) list,
   332     parse_translation: (string * ((Proof.context -> term list -> term) * stamp)) list,
   326     parse_translation: (string * ((Proof.context -> term list -> term) * stamp)) list,
   333     print_translation: (string * ((Proof.context -> typ -> term list -> term) * stamp)) list,
   327     print_translation: (string * ((Proof.context -> typ -> term list -> term) * stamp)) list,
   334     print_rules: (Ast.ast * Ast.ast) list,
   328     print_rules: (Ast.ast * Ast.ast) list,
   335     print_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list,
   329     print_ast_translation: (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list};
   336     token_translation: (string * string * (Proof.context -> string -> Pretty.T)) list};
       
   337 
   330 
   338 
   331 
   339 (* syn_ext *)
   332 (* syn_ext *)
   340 
   333 
   341 fun syn_ext' convert is_logtype mfixes consts trfuns tokentrfuns (parse_rules, print_rules) =
   334 fun syn_ext' convert is_logtype mfixes consts trfuns (parse_rules, print_rules) =
   342   let
   335   let
   343     val (parse_ast_translation, parse_translation, print_translation,
   336     val (parse_ast_translation, parse_translation, print_translation,
   344       print_ast_translation) = trfuns;
   337       print_ast_translation) = trfuns;
   345 
   338 
   346     val (xprods, parse_rules') = map (mfix_to_xprod convert is_logtype) mfixes
   339     val (xprods, parse_rules') = map (mfix_to_xprod convert is_logtype) mfixes
   349       distinct (op =) (map (fn Mfix x => #3 x) mfixes @ map (fn XProd x => #3 x) xprods);
   342       distinct (op =) (map (fn Mfix x => #3 x) mfixes @ map (fn XProd x => #3 x) xprods);
   350   in
   343   in
   351     Syn_Ext {
   344     Syn_Ext {
   352       xprods = xprods,
   345       xprods = xprods,
   353       consts = union (op =) consts mfix_consts,
   346       consts = union (op =) consts mfix_consts,
   354       prmodes = distinct (op =) (map (fn (m, _, _) => m) tokentrfuns),
       
   355       parse_ast_translation = parse_ast_translation,
   347       parse_ast_translation = parse_ast_translation,
   356       parse_rules = parse_rules' @ parse_rules,
   348       parse_rules = parse_rules' @ parse_rules,
   357       parse_translation = parse_translation,
   349       parse_translation = parse_translation,
   358       print_translation = print_translation,
   350       print_translation = print_translation,
   359       print_rules = map swap parse_rules' @ print_rules,
   351       print_rules = map swap parse_rules' @ print_rules,
   360       print_ast_translation = print_ast_translation,
   352       print_ast_translation = print_ast_translation}
   361       token_translation = tokentrfuns}
       
   362   end;
   353   end;
   363 
   354 
   364 
   355 
   365 val syn_ext = syn_ext' true (K false);
   356 val syn_ext = syn_ext' true (K false);
   366 
   357 
   367 fun syn_ext_const_names cs = syn_ext [] cs ([], [], [], []) [] ([], []);
   358 fun syn_ext_const_names cs = syn_ext [] cs ([], [], [], []) ([], []);
   368 fun syn_ext_rules rules = syn_ext [] [] ([], [], [], []) [] rules;
   359 fun syn_ext_rules rules = syn_ext [] [] ([], [], [], []) rules;
   369 fun syn_ext_advanced_trfuns trfuns = syn_ext [] [] trfuns [] ([], []);
   360 fun syn_ext_advanced_trfuns trfuns = syn_ext [] [] trfuns ([], []);
   370 fun syn_ext_tokentrfuns trfuns = syn_ext [] [] ([], [], [], []) trfuns ([], []);
       
   371 
   361 
   372 fun syn_ext_trfuns (atrs, trs, tr's, atr's) =
   362 fun syn_ext_trfuns (atrs, trs, tr's, atr's) =
   373   let fun simple (name, (f, s)) = (name, (K f, s)) in
   363   let fun simple (name, (f, s)) = (name, (K f, s)) in
   374     syn_ext_advanced_trfuns (map simple atrs, map simple trs, map simple tr's, map simple atr's)
   364     syn_ext_advanced_trfuns (map simple atrs, map simple trs, map simple tr's, map simple atr's)
   375   end;
   365   end;
   392    Mfix ("'(_')", spropT --> spropT, "", [0], max_pri),
   382    Mfix ("'(_')", spropT --> spropT, "", [0], max_pri),
   393    Mfix ("_::_",  [logicT, typeT] ---> logicT, "_constrain", [4, 0], 3),
   383    Mfix ("_::_",  [logicT, typeT] ---> logicT, "_constrain", [4, 0], 3),
   394    Mfix ("_::_",  [spropT, typeT] ---> spropT, "_constrain", [4, 0], 3)]
   384    Mfix ("_::_",  [spropT, typeT] ---> spropT, "_constrain", [4, 0], 3)]
   395   token_markers
   385   token_markers
   396   ([], [], [], [])
   386   ([], [], [], [])
   397   []
       
   398   ([], []);
   387   ([], []);
   399 
   388 
   400 end;
   389 end;