src/Pure/Syntax/type_ext.ML
changeset 239 08b6e842ec16
parent 18 c9ec452ff08f
child 258 e540b7d4ecb1
equal deleted inserted replaced
238:6af40e3a2bcb 239:08b6e842ec16
     4 
     4 
     5 The concrete syntax of types (used to bootstrap Pure).
     5 The concrete syntax of types (used to bootstrap Pure).
     6 
     6 
     7 TODO:
     7 TODO:
     8   term_of_typ: prune sorts
     8   term_of_typ: prune sorts
     9   move "_K" (?)
     9   move "_K", "_explode", "_implode"
    10 *)
    10 *)
    11 
    11 
    12 signature TYPE_EXT0 =
    12 signature TYPE_EXT0 =
    13 sig
    13 sig
    14   val typ_of_term: (indexname -> sort) -> term -> typ
    14   val typ_of_term: (indexname -> sort) -> term -> typ
    15 end;
    15 end;
    16 
    16 
    17 signature TYPE_EXT =
    17 signature TYPE_EXT =
    18 sig
    18 sig
    19   include TYPE_EXT0
    19   include TYPE_EXT0
    20   structure Extension: EXTENSION
    20   structure SynExt: SYN_EXT
    21   local open Extension Extension.XGram.Ast in
    21   local open SynExt SynExt.Ast in
    22     val term_of_typ: bool -> typ -> term
    22     val term_of_typ: bool -> typ -> term
    23     val tappl_ast_tr': ast * ast list -> ast
    23     val tappl_ast_tr': ast * ast list -> ast
    24     val type_ext: ext
    24     val type_ext: syn_ext
    25   end
    25   end
    26 end;
    26 end;
    27 
    27 
    28 functor TypeExtFun(structure Extension: EXTENSION and Lexicon: LEXICON): TYPE_EXT =
    28 functor TypeExtFun(structure Lexicon: LEXICON and SynExt: SYN_EXT): TYPE_EXT =
    29 struct
    29 struct
    30 
    30 
    31 structure Extension = Extension;
    31 structure SynExt = SynExt;
    32 open Extension Extension.XGram Extension.XGram.Ast Lexicon;
    32 open Lexicon SynExt SynExt.Ast;
    33 
    33 
    34 
    34 
    35 (** typ_of_term **)
    35 (** typ_of_term **)
    36 
    36 
    37 fun typ_of_term def_sort t =
    37 fun typ_of_term def_sort t =
   168 
   168 
   169 val sortT = Type ("sort", []);
   169 val sortT = Type ("sort", []);
   170 val classesT = Type ("classes", []);
   170 val classesT = Type ("classes", []);
   171 val typesT = Type ("types", []);
   171 val typesT = Type ("types", []);
   172 
   172 
   173 val type_ext =
   173 val type_ext = syn_ext
   174   Ext {
   174   [logic, "type"]
   175     roots = [logic, "type"],
   175   [Mfix ("_",           tfreeT --> typeT,              "", [], max_pri),
   176     mfix = [
   176    Mfix ("_",           tvarT --> typeT,               "", [], max_pri),
   177       Mfix ("_",           tfreeT --> typeT,              "", [], max_pri),
   177    Mfix ("_",           idT --> typeT,                 "", [], max_pri),
   178       Mfix ("_",           tvarT --> typeT,               "", [], max_pri),
   178    Mfix ("_::_",        [tfreeT, sortT] ---> typeT,    "_ofsort", [max_pri, 0], max_pri),
   179       Mfix ("_",           idT --> typeT,                 "", [], max_pri),
   179    Mfix ("_::_",        [tvarT, sortT] ---> typeT,     "_ofsort", [max_pri, 0], max_pri),
   180       Mfix ("_::_",        [tfreeT, sortT] ---> typeT,    "_ofsort", [max_pri, 0], max_pri),
   180    Mfix ("_",           idT --> sortT,                 "", [], max_pri),
   181       Mfix ("_::_",        [tvarT, sortT] ---> typeT,     "_ofsort", [max_pri, 0], max_pri),
   181    Mfix ("{}",          sortT,                         "_emptysort", [], max_pri),
   182       Mfix ("_",           idT --> sortT,                 "", [], max_pri),
   182    Mfix ("{_}",         classesT --> sortT,            "_sort", [], max_pri),
   183       Mfix ("{}",          sortT,                         "_emptysort", [], max_pri),
   183    Mfix ("_",           idT --> classesT,              "", [], max_pri),
   184       Mfix ("{_}",         classesT --> sortT,            "_sort", [], max_pri),
   184    Mfix ("_,_",         [idT, classesT] ---> classesT, "_classes", [], max_pri),
   185       Mfix ("_",           idT --> classesT,              "", [], max_pri),
   185    Mfix ("_ _",         [typeT, idT] ---> typeT,       "_tapp", [max_pri, 0], max_pri),  (* FIXME ambiguous *)
   186       Mfix ("_,_",         [idT, classesT] ---> classesT, "_classes", [], max_pri),
   186    Mfix ("((1'(_'))_)", [typesT, idT] ---> typeT,      "_tappl", [], max_pri),           (* FIXME ambiguous *)
   187       Mfix ("_ _",         [typeT, idT] ---> typeT,       "_tapp", [max_pri, 0], max_pri),  (* FIXME ambiguous *)
   187    Mfix ("_",           typeT --> typesT,              "", [], max_pri),
   188       Mfix ("((1'(_'))_)", [typesT, idT] ---> typeT,      "_tappl", [], max_pri),           (* FIXME ambiguous *)
   188    Mfix ("_,/ _",       [typeT, typesT] ---> typesT,   "_types", [], max_pri),
   189       Mfix ("_",           typeT --> typesT,              "", [], max_pri),
   189    Mfix ("(_/ => _)",   [typeT, typeT] ---> typeT,     "fun", [1, 0], 0),
   190       Mfix ("_,/ _",       [typeT, typesT] ---> typesT,   "_types", [], max_pri),
   190    Mfix ("([_]/ => _)", [typesT, typeT] ---> typeT,    "_bracket", [0, 0], 0)]
   191       Mfix ("(_/ => _)",   [typeT, typeT] ---> typeT,     "fun", [1, 0], 0),
   191   ["_K", "_explode", "_implode"]
   192       Mfix ("([_]/ => _)", [typesT, typeT] ---> typeT,    "_bracket", [0, 0], 0)],
   192   ([("_tapp", tappl_ast_tr), ("_tappl", tappl_ast_tr), ("_bracket", bracket_ast_tr)],
   193     extra_consts = ["_K"],
   193    [],
   194     parse_ast_translation = [("_tapp", tappl_ast_tr), ("_tappl", tappl_ast_tr),
   194    [],
   195       ("_bracket", bracket_ast_tr)],
   195    [("fun", fun_ast_tr')])
   196     parse_translation = [],
   196   ([], []);
   197     print_translation = [],
       
   198     print_ast_translation = [("fun", fun_ast_tr')]};
       
   199 
   197 
   200 
   198 
   201 end;
   199 end;
   202 
   200