src/Pure/Isar/parse.ML
changeset 69349 7cef9e386ffe
parent 67215 03d0c958d65a
child 69579 edea246cedb3
equal deleted inserted replaced
69348:f0aef5e337a2 69349:7cef9e386ffe
    26   val type_ident: string parser
    26   val type_ident: string parser
    27   val type_var: string parser
    27   val type_var: string parser
    28   val number: string parser
    28   val number: string parser
    29   val float_number: string parser
    29   val float_number: string parser
    30   val string: string parser
    30   val string: string parser
       
    31   val string_position: (string * Position.T) parser
    31   val alt_string: string parser
    32   val alt_string: string parser
    32   val verbatim: string parser
    33   val verbatim: string parser
    33   val cartouche: string parser
    34   val cartouche: string parser
    34   val eof: string parser
    35   val eof: string parser
    35   val command_name: string -> string parser
    36   val command_name: string -> string parser
    38   val keyword_improper: string -> string parser
    39   val keyword_improper: string -> string parser
    39   val $$$ : string -> string parser
    40   val $$$ : string -> string parser
    40   val reserved: string -> string parser
    41   val reserved: string -> string parser
    41   val underscore: string parser
    42   val underscore: string parser
    42   val maybe: 'a parser -> 'a option parser
    43   val maybe: 'a parser -> 'a option parser
       
    44   val maybe_position: ('a * Position.T) parser -> ('a option * Position.T) parser
    43   val tag_name: string parser
    45   val tag_name: string parser
    44   val tags: string list parser
    46   val tags: string list parser
    45   val opt_keyword: string -> bool parser
    47   val opt_keyword: string -> bool parser
    46   val opt_bang: bool parser
    48   val opt_bang: bool parser
    47   val begin: string parser
    49   val begin: string parser
    61   val and_list1': 'a context_parser -> 'a list context_parser
    63   val and_list1': 'a context_parser -> 'a list context_parser
    62   val list: 'a parser -> 'a list parser
    64   val list: 'a parser -> 'a list parser
    63   val list1: 'a parser -> 'a list parser
    65   val list1: 'a parser -> 'a list parser
    64   val properties: Properties.T parser
    66   val properties: Properties.T parser
    65   val name: string parser
    67   val name: string parser
       
    68   val name_range: (string * Position.range) parser
       
    69   val name_position: (string * Position.T) parser
    66   val binding: binding parser
    70   val binding: binding parser
    67   val embedded: string parser
    71   val embedded: string parser
       
    72   val embedded_position: (string * Position.T) parser
    68   val text: string parser
    73   val text: string parser
    69   val path: string parser
    74   val path: string parser
    70   val session_name: string parser
    75   val session_name: (string * Position.T) parser
    71   val theory_name: string parser
    76   val theory_name: (string * Position.T) parser
    72   val liberal_name: string parser
    77   val liberal_name: string parser
    73   val parname: string parser
    78   val parname: string parser
    74   val parbinding: binding parser
    79   val parbinding: binding parser
    75   val class: string parser
    80   val class: string parser
    76   val sort: string parser
    81   val sort: string parser
   108   val attribs: Token.src list parser
   113   val attribs: Token.src list parser
   109   val opt_attribs: Token.src list parser
   114   val opt_attribs: Token.src list parser
   110   val thm_sel: Facts.interval list parser
   115   val thm_sel: Facts.interval list parser
   111   val thm: (Facts.ref * Token.src list) parser
   116   val thm: (Facts.ref * Token.src list) parser
   112   val thms1: (Facts.ref * Token.src list) list parser
   117   val thms1: (Facts.ref * Token.src list) list parser
   113   val option_name: string parser
       
   114   val option_value: string parser
       
   115   val options: ((string * Position.T) * (string * Position.T)) list parser
   118   val options: ((string * Position.T) * (string * Position.T)) list parser
   116 end;
   119 end;
   117 
   120 
   118 structure Parse: PARSE =
   121 structure Parse: PARSE =
   119 struct
   122 struct
   216 
   219 
   217 val minus = sym_ident :-- (fn "-" => Scan.succeed () | _ => Scan.fail) >> #1;
   220 val minus = sym_ident :-- (fn "-" => Scan.succeed () | _ => Scan.fail) >> #1;
   218 
   221 
   219 val underscore = sym_ident :-- (fn "_" => Scan.succeed () | _ => Scan.fail) >> #1;
   222 val underscore = sym_ident :-- (fn "_" => Scan.succeed () | _ => Scan.fail) >> #1;
   220 fun maybe scan = underscore >> K NONE || scan >> SOME;
   223 fun maybe scan = underscore >> K NONE || scan >> SOME;
       
   224 fun maybe_position scan = position (underscore >> K NONE) || scan >> apfst SOME;
   221 
   225 
   222 val nat = number >> (#1 o Library.read_int o Symbol.explode);
   226 val nat = number >> (#1 o Library.read_int o Symbol.explode);
   223 val int = Scan.optional (minus >> K ~1) 1 -- nat >> op *;
   227 val int = Scan.optional (minus >> K ~1) 1 -- nat >> op *;
   224 val real = float_number >> Value.parse_real || int >> Real.fromInt;
   228 val real = float_number >> Value.parse_real || int >> Real.fromInt;
   225 
   229 
   263 
   267 
   264 val name =
   268 val name =
   265   group (fn () => "name")
   269   group (fn () => "name")
   266     (short_ident || long_ident || sym_ident || number || string);
   270     (short_ident || long_ident || sym_ident || number || string);
   267 
   271 
   268 val binding = position name >> Binding.make;
   272 val name_range = input name >> Input.source_content_range;
       
   273 val name_position = input name >> Input.source_content;
       
   274 
       
   275 val string_position = input string >> Input.source_content;
       
   276 
       
   277 val binding = name_position >> Binding.make;
   269 
   278 
   270 val embedded =
   279 val embedded =
   271   group (fn () => "embedded content")
   280   group (fn () => "embedded content")
   272     (cartouche || string || short_ident || long_ident || sym_ident ||
   281     (cartouche || string || short_ident || long_ident || sym_ident ||
   273       term_var || type_ident || type_var || number);
   282       term_var || type_ident || type_var || number);
   274 
   283 
       
   284 val embedded_position = input embedded >> Input.source_content;
       
   285 
   275 val text = group (fn () => "text") (embedded || verbatim);
   286 val text = group (fn () => "text") (embedded || verbatim);
   276 
   287 
   277 val path = group (fn () => "file name/path specification") embedded;
   288 val path = group (fn () => "file name/path specification") embedded;
   278 
   289 
   279 val session_name = group (fn () => "session name") name;
   290 val session_name = group (fn () => "session name") name_position;
   280 val theory_name = group (fn () => "theory name") name;
   291 val theory_name = group (fn () => "theory name") name_position;
   281 
   292 
   282 val liberal_name = keyword_with Token.ident_or_symbolic || name;
   293 val liberal_name = keyword_with Token.ident_or_symbolic || name;
   283 
   294 
   284 val parname = Scan.optional ($$$ "(" |-- name --| $$$ ")") "";
   295 val parname = Scan.optional ($$$ "(" |-- name --| $$$ ")") "";
   285 val parbinding = Scan.optional ($$$ "(" |-- binding --| $$$ ")") Binding.empty;
   296 val parbinding = Scan.optional ($$$ "(" |-- binding --| $$$ ")") Binding.empty;
   411 (* target information *)
   422 (* target information *)
   412 
   423 
   413 val private = position ($$$ "private") >> #2;
   424 val private = position ($$$ "private") >> #2;
   414 val qualified = position ($$$ "qualified") >> #2;
   425 val qualified = position ($$$ "qualified") >> #2;
   415 
   426 
   416 val target = ($$$ "(" -- $$$ "in") |-- !!! (position name --| $$$ ")");
   427 val target = ($$$ "(" -- $$$ "in") |-- !!! (name_position --| $$$ ")");
   417 val opt_target = Scan.option target;
   428 val opt_target = Scan.option target;
   418 
   429 
   419 
   430 
   420 (* arguments within outer syntax *)
   431 (* arguments within outer syntax *)
   421 
   432 
   465   nat >> Facts.Single) --| $$$ ")";
   476   nat >> Facts.Single) --| $$$ ")";
   466 
   477 
   467 val thm =
   478 val thm =
   468   $$$ "[" |-- attribs --| $$$ "]" >> pair (Facts.named "") ||
   479   $$$ "[" |-- attribs --| $$$ "]" >> pair (Facts.named "") ||
   469   (literal_fact >> Facts.Fact ||
   480   (literal_fact >> Facts.Fact ||
   470     position name -- Scan.option thm_sel >> Facts.Named) -- opt_attribs;
   481     name_position -- Scan.option thm_sel >> Facts.Named) -- opt_attribs;
   471 
   482 
   472 val thms1 = Scan.repeat1 thm;
   483 val thms1 = Scan.repeat1 thm;
   473 
   484 
   474 
   485 
   475 (* options *)
   486 (* options *)
   476 
   487 
   477 val option_name = group (fn () => "option name") name;
   488 val option_name = group (fn () => "option name") name_position;
   478 val option_value = group (fn () => "option value") ((token real || token name) >> Token.content_of);
   489 val option_value = group (fn () => "option value") ((token real || token name) >> Token.content_of);
   479 
   490 
   480 val option =
   491 val option =
   481   position option_name :-- (fn (_, pos) =>
   492   option_name :-- (fn (_, pos) =>
   482     Scan.optional ($$$ "=" |-- !!! (position option_value)) ("true", pos));
   493     Scan.optional ($$$ "=" |-- !!! (position option_value)) ("true", pos));
   483 
   494 
   484 val options = $$$ "[" |-- list1 option --| $$$ "]";
   495 val options = $$$ "[" |-- list1 option --| $$$ "]";
   485 
   496 
   486 end;
   497 end;