src/Pure/Isar/token.ML
changeset 67497 3a0b08e7dfe9
parent 67495 90d760fa8f34
child 67501 182a18af5b41
equal deleted inserted replaced
67496:eff8b632bdc6 67497:3a0b08e7dfe9
    80   val args_of_src: src -> T list
    80   val args_of_src: src -> T list
    81   val checked_src: src -> bool
    81   val checked_src: src -> bool
    82   val check_src: Proof.context -> (Proof.context -> 'a Name_Space.table) -> src -> src * 'a
    82   val check_src: Proof.context -> (Proof.context -> 'a Name_Space.table) -> src -> src * 'a
    83   val pretty_src: Proof.context -> src -> Pretty.T
    83   val pretty_src: Proof.context -> src -> Pretty.T
    84   val ident_or_symbolic: string -> bool
    84   val ident_or_symbolic: string -> bool
    85   val source': bool -> Keyword.keywords -> (Symbol_Pos.T, 'a) Source.source ->
       
    86     (T, (Symbol_Pos.T, 'a) Source.source) Source.source
       
    87   val source_proper: (T, 'a) Source.source -> (T, (T, 'a) Source.source) Source.source
    85   val source_proper: (T, 'a) Source.source -> (T, (T, 'a) Source.source) Source.source
    88   val source: Keyword.keywords ->
    86   val source: Keyword.keywords ->
    89     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    87     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    90       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
    88       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
    91   val source_strict: Keyword.keywords ->
    89   val source_strict: Keyword.keywords ->
    92     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    90     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    93       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
    91       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
    94   val read_cartouche: Symbol_Pos.T list -> T
    92   val read_cartouche: Symbol_Pos.T list -> T
    95   val tokenize: Keyword.keywords -> Symbol_Pos.T list -> T list
    93   val tokenize: Keyword.keywords -> {strict: bool} -> Symbol_Pos.T list -> T list
    96   val explode: Keyword.keywords -> Position.T -> string -> T list
    94   val explode: Keyword.keywords -> Position.T -> string -> T list
    97   val explode0: Keyword.keywords -> string -> T list
    95   val explode0: Keyword.keywords -> string -> T list
    98   val print_name: Keyword.keywords -> string -> string
    96   val print_name: Keyword.keywords -> string -> string
    99   val make: (int * int) * string -> Position.T -> T * Position.T
    97   val make: (int * int) * string -> Position.T -> T * Position.T
   100   val make_string: string * Position.T -> T
    98   val make_string: string * Position.T -> T
   650     Scan.one (Symbol.not_eof o Symbol_Pos.symbol) >> single)
   648     Scan.one (Symbol.not_eof o Symbol_Pos.symbol) >> single)
   651   >> (single o token (Error msg));
   649   >> (single o token (Error msg));
   652 
   650 
   653 in
   651 in
   654 
   652 
   655 fun source' strict keywords =
   653 fun make_source keywords {strict} =
   656   let
   654   let
   657     val scan_strict = Scan.bulk (scan_token keywords);
   655     val scan_strict = Scan.bulk (scan_token keywords);
   658     val scan = if strict then scan_strict else Scan.recover scan_strict recover;
   656     val scan = if strict then scan_strict else Scan.recover scan_strict recover;
   659   in Source.source Symbol_Pos.stopper scan end;
   657   in Source.source Symbol_Pos.stopper scan end;
   660 
   658 
   661 fun source keywords pos src = Symbol_Pos.source pos src |> source' false keywords;
   659 fun source keywords pos src =
   662 fun source_strict keywords pos src = Symbol_Pos.source pos src |> source' true keywords;
   660   Symbol_Pos.source pos src |> make_source keywords {strict = false};
       
   661 
       
   662 fun source_strict keywords pos src =
       
   663   Symbol_Pos.source pos src |> make_source keywords {strict = true};
   663 
   664 
   664 fun read_cartouche syms =
   665 fun read_cartouche syms =
   665   (case Scan.read Symbol_Pos.stopper (scan_cartouche >> token_range Cartouche) syms of
   666   (case Scan.read Symbol_Pos.stopper (scan_cartouche >> token_range Cartouche) syms of
   666     SOME tok => tok
   667     SOME tok => tok
   667   | NONE => error ("Single cartouche expected" ^ Position.here (#1 (Symbol_Pos.range syms))));
   668   | NONE => error ("Single cartouche expected" ^ Position.here (#1 (Symbol_Pos.range syms))));
   669 end;
   670 end;
   670 
   671 
   671 
   672 
   672 (* explode *)
   673 (* explode *)
   673 
   674 
   674 fun tokenize keywords syms =
   675 fun tokenize keywords strict syms =
   675   Source.of_list syms |> source' false keywords |> Source.exhaust;
   676   Source.of_list syms |> make_source keywords strict |> Source.exhaust;
   676 
   677 
   677 fun explode keywords pos text =
   678 fun explode keywords pos text =
   678   Symbol_Pos.explode (text, pos) |> tokenize keywords;
   679   Symbol_Pos.explode (text, pos) |> tokenize keywords {strict = false};
   679 
   680 
   680 fun explode0 keywords = explode keywords Position.none;
   681 fun explode0 keywords = explode keywords Position.none;
   681 
   682 
   682 
   683 
   683 (* print name in parsable form *)
   684 (* print name in parsable form *)
   723 
   724 
   724 (* read antiquotation source *)
   725 (* read antiquotation source *)
   725 
   726 
   726 fun read_no_commands keywords scan syms =
   727 fun read_no_commands keywords scan syms =
   727   Source.of_list syms
   728   Source.of_list syms
   728   |> source' true (Keyword.no_command_keywords keywords)
   729   |> make_source (Keyword.no_command_keywords keywords) {strict = true}
   729   |> source_proper
   730   |> source_proper
   730   |> Source.source stopper (Scan.error (Scan.bulk scan))
   731   |> Source.source stopper (Scan.error (Scan.bulk scan))
   731   |> Source.exhaust;
   732   |> Source.exhaust;
   732 
   733 
   733 fun read_antiq keywords scan (syms, pos) =
   734 fun read_antiq keywords scan (syms, pos) =