src/Pure/Isar/outer_parse.ML
changeset 14646 f5f2340398f9
parent 14605 9de4d64eee3b
child 14835 695ee8ad0bb6
equal deleted inserted replaced
14645:83776a9f0a9c 14646:f5f2340398f9
    32   val verbatim: token list -> string * token list
    32   val verbatim: token list -> string * token list
    33   val sync: token list -> string * token list
    33   val sync: token list -> string * token list
    34   val eof: token list -> string * token list
    34   val eof: token list -> string * token list
    35   val not_eof: token list -> token * token list
    35   val not_eof: token list -> token * token list
    36   val opt_unit: token list -> unit * token list
    36   val opt_unit: token list -> unit * token list
       
    37   val opt_keyword: string -> token list -> bool * token list
    37   val nat: token list -> int * token list
    38   val nat: token list -> int * token list
    38   val enum: string -> (token list -> 'a * token list) -> token list -> 'a list * token list
    39   val enum: string -> (token list -> 'a * token list) -> token list -> 'a list * token list
    39   val enum1: string -> (token list -> 'a * token list) -> token list -> 'a list * token list
    40   val enum1: string -> (token list -> 'a * token list) -> token list -> 'a list * token list
    40   val list: (token list -> 'a * token list) -> token list -> 'a list * token list
    41   val list: (token list -> 'a * token list) -> token list -> 'a list * token list
    41   val list1: (token list -> 'a * token list) -> token list -> 'a list * token list
    42   val list1: (token list -> 'a * token list) -> token list -> 'a list * token list
    51   val typ: token list -> string * token list
    52   val typ: token list -> string * token list
    52   val opt_infix: token list -> Syntax.mixfix * token list
    53   val opt_infix: token list -> Syntax.mixfix * token list
    53   val opt_mixfix: token list -> Syntax.mixfix * token list
    54   val opt_mixfix: token list -> Syntax.mixfix * token list
    54   val opt_infix': token list -> Syntax.mixfix * token list
    55   val opt_infix': token list -> Syntax.mixfix * token list
    55   val opt_mixfix': token list -> Syntax.mixfix * token list
    56   val opt_mixfix': token list -> Syntax.mixfix * token list
       
    57   val mixfix': token list -> Syntax.mixfix * token list
    56   val const: token list -> (bstring * string * Syntax.mixfix) * token list
    58   val const: token list -> (bstring * string * Syntax.mixfix) * token list
    57   val term: token list -> string * token list
    59   val term: token list -> string * token list
    58   val prop: token list -> string * token list
    60   val prop: token list -> string * token list
    59   val propp: token list -> (string * (string list * string list)) * token list
    61   val propp: token list -> (string * (string list * string list)) * token list
    60   val termp: token list -> (string * string list) * token list
    62   val termp: token list -> (string * string list) * token list
   151 
   153 
   152 val not_eof = Scan.one T.not_eof;
   154 val not_eof = Scan.one T.not_eof;
   153 
   155 
   154 val opt_unit = Scan.optional ($$$ "(" -- $$$ ")" >> (K ())) ();
   156 val opt_unit = Scan.optional ($$$ "(" -- $$$ ")" >> (K ())) ();
   155 
   157 
       
   158 fun opt_keyword s = Scan.optional ($$$ "(" |-- !!! (($$$ s >> K true) --| $$$ ")")) false;
       
   159 
   156 
   160 
   157 (* enumerations *)
   161 (* enumerations *)
   158 
   162 
   159 fun enum1 sep scan = scan -- Scan.repeat ($$$ sep |-- !!! scan) >> op ::;
   163 fun enum1 sep scan = scan -- Scan.repeat ($$$ sep |-- !!! scan) >> op ::;
   160 fun enum sep scan = enum1 sep scan || Scan.succeed [];
   164 fun enum sep scan = enum1 sep scan || Scan.succeed [];
   171 val name = group "name declaration" (short_ident || sym_ident || string || number);
   175 val name = group "name declaration" (short_ident || sym_ident || string || number);
   172 val xname = group "name reference" (short_ident || long_ident || sym_ident || string || number);
   176 val xname = group "name reference" (short_ident || long_ident || sym_ident || string || number);
   173 val text = group "text" (short_ident || long_ident || sym_ident || string || number || verbatim);
   177 val text = group "text" (short_ident || long_ident || sym_ident || string || number || verbatim);
   174 
   178 
   175 val uname = underscore >> K None || name >> Some;
   179 val uname = underscore >> K None || name >> Some;
   176   (* CB: underscore yields None, any other name Some with that string.
   180 
   177      Used, for example, in the renaming of locale parameters.  *)
       
   178 
   181 
   179 (* sorts and arities *)
   182 (* sorts and arities *)
   180 
   183 
   181 val sort = group "sort" xname;
   184 val sort = group "sort" xname;
   182 
   185 
   213 
   216 
   214 val mixfix =
   217 val mixfix =
   215   (string -- !!! (opt_pris -- Scan.optional nat Syntax.max_pri))
   218   (string -- !!! (opt_pris -- Scan.optional nat Syntax.max_pri))
   216   >> (Syntax.Mixfix o triple2);
   219   >> (Syntax.Mixfix o triple2);
   217 
   220 
   218 fun opt_fix guard fix =
   221 fun fix_decl guard fix = $$$ "(" |-- guard (fix --| $$$ ")");
   219   Scan.optional ($$$ "(" |-- guard (fix --| $$$ ")")) Syntax.NoSyn;
   222 fun opt_fix guard fix = Scan.optional (fix_decl guard fix) Syntax.NoSyn;
   220 
   223 
   221 val opt_infix = opt_fix !!! (infxl || infxr || infx);
   224 val opt_infix = opt_fix !!! (infxl || infxr || infx);
   222 val opt_mixfix = opt_fix !!! (mixfix || binder || infxl || infxr || infx);
   225 val opt_mixfix = opt_fix !!! (mixfix || binder || infxl || infxr || infx);
   223 
       
   224 val opt_infix' = opt_fix I (infxl || infxr || infx);
   226 val opt_infix' = opt_fix I (infxl || infxr || infx);
   225 val opt_mixfix' = opt_fix I (mixfix || binder || infxl || infxr || infx);
   227 val opt_mixfix' = opt_fix I (mixfix || binder || infxl || infxr || infx);
       
   228 val mixfix' = fix_decl !!! (mixfix || binder || infxl || infxr || infx);
   226 
   229 
   227 
   230 
   228 (* consts *)
   231 (* consts *)
   229 
   232 
   230 val const =
   233 val const =