src/Pure/Isar/outer_parse.ML
changeset 29310 1a633304fa5e
parent 28965 1de908189869
child 29581 b3b33e0298eb
equal deleted inserted replaced
29309:aa6d11fbe3b6 29310:1a633304fa5e
     1 (*  Title:      Pure/Isar/outer_parse.ML
     1 (*  Title:      Pure/Isar/outer_parse.ML
     2     ID:         $Id$
       
     3     Author:     Markus Wenzel, TU Muenchen
     2     Author:     Markus Wenzel, TU Muenchen
     4 
     3 
     5 Generic parsers for Isabelle/Isar outer syntax.
     4 Generic parsers for Isabelle/Isar outer syntax.
     6 *)
     5 *)
     7 
     6 
     8 signature OUTER_PARSE =
     7 signature OUTER_PARSE =
     9 sig
     8 sig
    10   type token = OuterLex.token
     9   type token = OuterLex.token
       
    10   type 'a parser = token list -> 'a * token list
    11   val group: string -> (token list -> 'a) -> token list -> 'a
    11   val group: string -> (token list -> 'a) -> token list -> 'a
    12   val !!! : (token list -> 'a) -> token list -> 'a
    12   val !!! : (token list -> 'a) -> token list -> 'a
    13   val !!!! : (token list -> 'a) -> token list -> 'a
    13   val !!!! : (token list -> 'a) -> token list -> 'a
    14   val triple1: ('a * 'b) * 'c -> 'a * 'b * 'c
    14   val triple1: ('a * 'b) * 'c -> 'a * 'b * 'c
    15   val triple2: 'a * ('b * 'c) -> 'a * 'b * 'c
    15   val triple2: 'a * ('b * 'c) -> 'a * 'b * 'c
    16   val triple_swap: ('a * 'b) * 'c -> ('a * 'c) * 'b
    16   val triple_swap: ('a * 'b) * 'c -> ('a * 'c) * 'b
    17   val not_eof: token list -> token * token list
    17   val not_eof: token parser
    18   val position: (token list -> 'a * 'b) -> token list -> ('a * Position.T) * 'b
    18   val position: (token list -> 'a * 'b) -> token list -> ('a * Position.T) * 'b
    19   val command: token list -> string * token list
    19   val command: string parser
    20   val keyword: token list -> string * token list
    20   val keyword: string parser
    21   val short_ident: token list -> string * token list
    21   val short_ident: string parser
    22   val long_ident: token list -> string * token list
    22   val long_ident: string parser
    23   val sym_ident: token list -> string * token list
    23   val sym_ident: string parser
    24   val minus: token list -> string * token list
    24   val minus: string parser
    25   val term_var: token list -> string * token list
    25   val term_var: string parser
    26   val type_ident: token list -> string * token list
    26   val type_ident: string parser
    27   val type_var: token list -> string * token list
    27   val type_var: string parser
    28   val number: token list -> string * token list
    28   val number: string parser
    29   val string: token list -> string * token list
    29   val string: string parser
    30   val alt_string: token list -> string * token list
    30   val alt_string: string parser
    31   val verbatim: token list -> string * token list
    31   val verbatim: string parser
    32   val sync: token list -> string * token list
    32   val sync: string parser
    33   val eof: token list -> string * token list
    33   val eof: string parser
    34   val keyword_with: (string -> bool) -> token list -> string * token list
    34   val keyword_with: (string -> bool) -> string parser
    35   val keyword_ident_or_symbolic: token list -> string * token list
    35   val keyword_ident_or_symbolic: string parser
    36   val $$$ : string -> token list -> string * token list
    36   val $$$ : string -> string parser
    37   val reserved: string -> token list -> string * token list
    37   val reserved: string -> string parser
    38   val semicolon: token list -> string * token list
    38   val semicolon: string parser
    39   val underscore: token list -> string * token list
    39   val underscore: string parser
    40   val maybe: (token list -> 'a * token list) -> token list -> 'a option * token list
    40   val maybe: 'a parser -> 'a option parser
    41   val tag_name: token list -> string * token list
    41   val tag_name: string parser
    42   val tags: token list -> string list * token list
    42   val tags: string list parser
    43   val opt_unit: token list -> unit * token list
    43   val opt_unit: unit parser
    44   val opt_keyword: string -> token list -> bool * token list
    44   val opt_keyword: string -> bool parser
    45   val begin: token list -> string * token list
    45   val begin: string parser
    46   val opt_begin: token list -> bool * token list
    46   val opt_begin: bool parser
    47   val nat: token list -> int * token list
    47   val nat: int parser
    48   val int: token list -> int * token list
    48   val int: int parser
    49   val enum: string -> (token list -> 'a * token list) -> token list -> 'a list * token list
    49   val enum: string -> 'a parser -> 'a list parser
    50   val enum1: string -> (token list -> 'a * token list) -> token list -> 'a list * token list
    50   val enum1: string -> 'a parser -> 'a list parser
    51   val and_list: (token list -> 'a * token list) -> token list -> 'a list * token list
    51   val and_list: 'a parser -> 'a list parser
    52   val and_list1: (token list -> 'a * token list) -> token list -> 'a list * token list
    52   val and_list1: 'a parser -> 'a list parser
    53   val enum': string -> ('a * token list -> 'b * ('a * token list)) ->
    53   val enum': string -> ('a * token list -> 'b * ('a * token list)) ->
    54     'a * token list -> 'b list * ('a * token list)
    54     'a * token list -> 'b list * ('a * token list)
    55   val enum1': string -> ('a * token list -> 'b * ('a * token list)) ->
    55   val enum1': string -> ('a * token list -> 'b * ('a * token list)) ->
    56     'a * token list -> 'b list * ('a * token list)
    56     'a * token list -> 'b list * ('a * token list)
    57   val and_list': ('a * token list -> 'b * ('a * token list)) ->
    57   val and_list': ('a * token list -> 'b * ('a * token list)) ->
    58     'a * token list -> 'b list * ('a * token list)
    58     'a * token list -> 'b list * ('a * token list)
    59   val and_list1': ('a * token list -> 'b * ('a * token list)) ->
    59   val and_list1': ('a * token list -> 'b * ('a * token list)) ->
    60     'a * token list -> 'b list * ('a * token list)
    60     'a * token list -> 'b list * ('a * token list)
    61   val list: (token list -> 'a * token list) -> token list -> 'a list * token list
    61   val list: 'a parser -> 'a list parser
    62   val list1: (token list -> 'a * token list) -> token list -> 'a list * token list
    62   val list1: 'a parser -> 'a list parser
    63   val name: token list -> bstring * token list
    63   val name: bstring parser
    64   val binding: token list -> Binding.T * token list
    64   val binding: Binding.T parser
    65   val xname: token list -> xstring * token list
    65   val xname: xstring parser
    66   val text: token list -> string * token list
    66   val text: string parser
    67   val path: token list -> Path.T * token list
    67   val path: Path.T parser
    68   val parname: token list -> string * token list
    68   val parname: string parser
    69   val parbinding: token list -> Binding.T * token list
    69   val parbinding: Binding.T parser
    70   val sort: token list -> string * token list
    70   val sort: string parser
    71   val arity: token list -> (string * string list * string) * token list
    71   val arity: (string * string list * string) parser
    72   val multi_arity: token list -> (string list * string list * string) * token list
    72   val multi_arity: (string list * string list * string) parser
    73   val type_args: token list -> string list * token list
    73   val type_args: string list parser
    74   val typ_group: token list -> string * token list
    74   val typ_group: string parser
    75   val typ: token list -> string * token list
    75   val typ: string parser
    76   val mixfix: token list -> mixfix * token list
    76   val mixfix: mixfix parser
    77   val mixfix': token list -> mixfix * token list
    77   val mixfix': mixfix parser
    78   val opt_infix: token list -> mixfix * token list
    78   val opt_infix: mixfix parser
    79   val opt_infix': token list -> mixfix * token list
    79   val opt_infix': mixfix parser
    80   val opt_mixfix: token list -> mixfix * token list
    80   val opt_mixfix: mixfix parser
    81   val opt_mixfix': token list -> mixfix * token list
    81   val opt_mixfix': mixfix parser
    82   val where_: token list -> string * token list
    82   val where_: string parser
    83   val const: token list -> (string * string * mixfix) * token list
    83   val const: (string * string * mixfix) parser
    84   val params: token list -> (Binding.T * string option) list * token list
    84   val params: (Binding.T * string option) list parser
    85   val simple_fixes: token list -> (Binding.T * string option) list * token list
    85   val simple_fixes: (Binding.T * string option) list parser
    86   val fixes: token list -> (Binding.T * string option * mixfix) list * token list
    86   val fixes: (Binding.T * string option * mixfix) list parser
    87   val for_fixes: token list -> (Binding.T * string option * mixfix) list * token list
    87   val for_fixes: (Binding.T * string option * mixfix) list parser
    88   val for_simple_fixes: token list -> (Binding.T * string option) list * token list
    88   val for_simple_fixes: (Binding.T * string option) list parser
    89   val ML_source: token list -> (SymbolPos.text * Position.T) * token list
    89   val ML_source: (SymbolPos.text * Position.T) parser
    90   val doc_source: token list -> (SymbolPos.text * Position.T) * token list
    90   val doc_source: (SymbolPos.text * Position.T) parser
    91   val properties: token list -> Properties.T * token list
    91   val term_group: string parser
    92   val props_text: token list -> (Position.T * string) * token list
    92   val prop_group: string parser
    93   val term_group: token list -> string * token list
    93   val term: string parser
    94   val prop_group: token list -> string * token list
    94   val prop: string parser
    95   val term: token list -> string * token list
    95   val propp: (string * string list) parser
    96   val prop: token list -> string * token list
    96   val termp: (string * string list) parser
    97   val propp: token list -> (string * string list) * token list
    97   val target: xstring parser
    98   val termp: token list -> (string * string list) * token list
    98   val opt_target: xstring option parser
    99   val target: token list -> xstring * token list
       
   100   val opt_target: token list -> xstring option * token list
       
   101 end;
    99 end;
   102 
   100 
   103 structure OuterParse: OUTER_PARSE =
   101 structure OuterParse: OUTER_PARSE =
   104 struct
   102 struct
   105 
   103 
   106 structure T = OuterLex;
   104 structure T = OuterLex;
   107 type token = T.token;
   105 type token = T.token;
       
   106 
       
   107 type 'a parser = token list -> 'a * token list;
   108 
   108 
   109 
   109 
   110 (** error handling **)
   110 (** error handling **)
   111 
   111 
   112 (* group atomic parsers (no cuts!) *)
   112 (* group atomic parsers (no cuts!) *)
   308 (* embedded source text *)
   308 (* embedded source text *)
   309 
   309 
   310 val ML_source = source_position (group "ML source" text);
   310 val ML_source = source_position (group "ML source" text);
   311 val doc_source = source_position (group "document source" text);
   311 val doc_source = source_position (group "document source" text);
   312 
   312 
   313 val properties = $$$ "(" |-- !!! (list1 (string -- ($$$ "=" |-- string)) --| $$$ ")");
       
   314 
       
   315 val props_text =
       
   316   Scan.optional properties [] -- position string >> (fn (props, (str, pos)) =>
       
   317     (Position.of_properties (Position.default_properties pos props), str));
       
   318 
       
   319 
   313 
   320 (* terms *)
   314 (* terms *)
   321 
   315 
   322 val trm = short_ident || long_ident || sym_ident || term_var || number || string;
   316 val trm = short_ident || long_ident || sym_ident || term_var || number || string;
   323 
   317