src/Pure/Isar/token.ML
changeset 58864 505a8150368a
parent 58863 64e571275b36
child 58865 ce8d13995516
equal deleted inserted replaced
58863:64e571275b36 58864:505a8150368a
    77   val closure_src: src -> src
    77   val closure_src: src -> src
    78   val pretty_value: Proof.context -> T -> Pretty.T
    78   val pretty_value: Proof.context -> T -> Pretty.T
    79   val pretty_src: Proof.context -> src -> Pretty.T
    79   val pretty_src: Proof.context -> src -> Pretty.T
    80   val ident_or_symbolic: string -> bool
    80   val ident_or_symbolic: string -> bool
    81   val source_proper: (T, 'a) Source.source -> (T, (T, 'a) Source.source) Source.source
    81   val source_proper: (T, 'a) Source.source -> (T, (T, 'a) Source.source) Source.source
    82   val source': {do_recover: bool} -> (unit -> Scan.lexicon * Scan.lexicon) ->
    82   val source: (unit -> Scan.lexicon * Scan.lexicon) ->
    83     (Symbol_Pos.T, 'a) Source.source -> (T, (Symbol_Pos.T, 'a) Source.source) Source.source
    83     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    84   val source: {do_recover: bool} -> (unit -> Scan.lexicon * Scan.lexicon) ->
    84       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
       
    85   val source_strict: (unit -> Scan.lexicon * Scan.lexicon) ->
    85     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    86     Position.T -> (Symbol.symbol, 'a) Source.source -> (T,
    86       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
    87       (Symbol_Pos.T, Position.T * (Symbol.symbol, 'a) Source.source) Source.source) Source.source
    87   type 'a parser = T list -> 'a * T list
    88   type 'a parser = T list -> 'a * T list
    88   type 'a context_parser = Context.generic * T list -> 'a * (Context.generic * T list)
    89   type 'a context_parser = Context.generic * T list -> 'a * (Context.generic * T list)
    89   val read: Scan.lexicon -> 'a parser -> Symbol_Pos.T list * Position.T -> 'a list
    90   val read: Scan.lexicon -> 'a parser -> Symbol_Pos.T list * Position.T -> 'a list
   558     Scan.one (Symbol.not_eof o Symbol_Pos.symbol) >> single)
   559     Scan.one (Symbol.not_eof o Symbol_Pos.symbol) >> single)
   559   >> (single o token (Error msg));
   560   >> (single o token (Error msg));
   560 
   561 
   561 in
   562 in
   562 
   563 
   563 fun source' {do_recover} get_lex =
   564 fun source' strict get_lex =
   564   Source.source Symbol_Pos.stopper (Scan.bulk (fn xs => scan (get_lex ()) xs))
   565   let
   565     (if do_recover then SOME recover else NONE);
   566     val scan_strict = Scan.bulk (fn xs => scan (get_lex ()) xs);
   566 
   567     val scan = if strict then scan_strict else Scan.recover scan_strict recover;
   567 fun source do_recover get_lex pos src =
   568   in Source.source Symbol_Pos.stopper scan end;
   568   Symbol_Pos.source pos src
   569 
   569   |> source' do_recover get_lex;
   570 fun source get_lex pos src = Symbol_Pos.source pos src |> source' false get_lex;
       
   571 fun source_strict get_lex pos src = Symbol_Pos.source pos src |> source' true get_lex;
   570 
   572 
   571 end;
   573 end;
   572 
   574 
   573 
   575 
   574 
   576 
   580 
   582 
   581 (* read source *)
   583 (* read source *)
   582 
   584 
   583 fun read lex scan (syms, pos) =
   585 fun read lex scan (syms, pos) =
   584   Source.of_list syms
   586   Source.of_list syms
   585   |> source' {do_recover = false} (K (lex, Scan.empty_lexicon))
   587   |> source' true (K (lex, Scan.empty_lexicon))
   586   |> source_proper
   588   |> source_proper
   587   |> Source.source stopper (Scan.error (Scan.bulk scan)) NONE
   589   |> Source.source stopper (Scan.error (Scan.bulk scan))
   588   |> Source.exhaust;
   590   |> Source.exhaust;
   589 
   591 
   590 fun read_antiq lex scan (syms, pos) =
   592 fun read_antiq lex scan (syms, pos) =
   591   let
   593   let
   592     fun err msg =
   594     fun err msg =