author | wenzelm |
Sat, 26 Jan 2008 17:08:41 +0100 | |
changeset 25982 | caee173104d3 |
parent 25846 | f5fb187ae10d |
child 27732 | 8dbf5761a24a |
permissions | -rw-r--r-- |
6118 | 1 |
(* Title: Pure/General/source.ML |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
2 |
ID: $Id$ |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
3 |
Author: Markus Wenzel, TU Muenchen |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
4 |
|
8806 | 5 |
Coalgebraic data sources -- efficient purely functional input streams. |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
6 |
*) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
7 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
8 |
signature SOURCE = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
9 |
sig |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
10 |
type ('a, 'b) source |
6681 | 11 |
val default_prompt: string |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
12 |
val set_prompt: string -> ('a, 'b) source -> ('a, 'b) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
13 |
val get: ('a, 'b) source -> 'a list * ('a, 'b) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
14 |
val unget: 'a list * ('a, 'b) source -> ('a, 'b) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
15 |
val get_single: ('a, 'b) source -> ('a * ('a, 'b) source) option |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
16 |
val exhaust: ('a, 'b) source -> 'a list |
19485 | 17 |
val map_filter: ('a -> 'b option) -> ('a, 'c) source -> ('b, ('a, 'c) source) source |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
18 |
val filter: ('a -> bool) -> ('a, 'b) source -> ('a, ('a, 'b) source) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
19 |
val of_list: 'a list -> ('a, 'a list) source |
24064 | 20 |
val of_list_limited: int -> 'a list -> ('a, 'a list) source |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
21 |
val of_string: string -> (string, string list) source |
9123
f8f54877a18c
added exhausted: ('a, 'b) source -> ('a, 'a list) source;
wenzelm
parents:
8806
diff
changeset
|
22 |
val exhausted: ('a, 'b) source -> ('a, 'a list) source |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
23 |
val tty: (string, unit) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
24 |
val source': 'a -> 'b * ('b -> bool) -> ('a * 'b list -> 'c list * ('a * 'b list)) -> |
23682
cf4773532006
nested source: explicit interactive flag for recover avoids duplicate errors;
wenzelm
parents:
23675
diff
changeset
|
25 |
(bool * (string -> 'a * 'b list -> 'c list * ('a * 'b list))) option -> |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
26 |
('b, 'e) source -> ('c, 'a * ('b, 'e) source) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
27 |
val source: 'a * ('a -> bool) -> ('a list -> 'b list * 'a list) -> |
23682
cf4773532006
nested source: explicit interactive flag for recover avoids duplicate errors;
wenzelm
parents:
23675
diff
changeset
|
28 |
(bool * (string -> 'a list -> 'b list * 'a list)) option -> |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
29 |
('a, 'd) source -> ('b, ('a, 'd) source) source |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
30 |
end; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
31 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
32 |
structure Source: SOURCE = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
33 |
struct |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
34 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
35 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
36 |
(** datatype source **) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
37 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
38 |
datatype ('a, 'b) source = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
39 |
Source of |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
40 |
{buffer: 'a list, |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
41 |
info: 'b, |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
42 |
prompt: string, |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
43 |
drain: string -> 'b -> 'a list * 'b}; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
44 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
45 |
fun make_source buffer info prompt drain = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
46 |
Source {buffer = buffer, info = info, prompt = prompt, drain = drain}; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
47 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
48 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
49 |
(* prompt *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
50 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
51 |
val default_prompt = "> "; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
52 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
53 |
fun set_prompt prompt (Source {buffer, info, prompt = _, drain}) = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
54 |
make_source buffer info prompt drain; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
55 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
56 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
57 |
(* get / unget *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
58 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
59 |
fun get (Source {buffer = [], info, prompt, drain}) = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
60 |
let val (xs, info') = drain prompt info |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
61 |
in (xs, make_source [] info' prompt drain) end |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
62 |
| get (Source {buffer, info, prompt, drain}) = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
63 |
(buffer, make_source [] info prompt drain); |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
64 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
65 |
fun unget (xs, Source {buffer, info, prompt, drain}) = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
66 |
make_source (xs @ buffer) info prompt drain; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
67 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
68 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
69 |
(* variations on get *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
70 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
71 |
fun get_prompt prompt src = get (set_prompt prompt src); |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
72 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
73 |
fun get_single src = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
74 |
(case get src of |
15531 | 75 |
([], _) => NONE |
76 |
| (x :: xs, src') => SOME (x, unget (xs, src'))); |
|
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
77 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
78 |
fun exhaust src = |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
79 |
(case get src of |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
80 |
([], _) => [] |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
81 |
| (xs, src') => xs @ exhaust src'); |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
82 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
83 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
84 |
(* (map)filter *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
85 |
|
19485 | 86 |
fun drain_map_filter f prompt src = |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
87 |
let |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
88 |
val (xs, src') = get_prompt prompt src; |
19485 | 89 |
val xs' = map_filter f xs; |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
90 |
in |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
91 |
if null xs orelse not (null xs') then (xs', src') |
19485 | 92 |
else drain_map_filter f prompt src' |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
93 |
end; |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
94 |
|
19485 | 95 |
fun map_filter f src = make_source [] src default_prompt (drain_map_filter f); |
96 |
fun filter pred = map_filter (fn x => if pred x then SOME x else NONE); |
|
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
97 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
98 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
99 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
100 |
(** build sources **) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
101 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
102 |
(* list source *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
103 |
|
14727
ab06e87e5c83
Source.of_list: no buffer limitation (now pointless due to tail-recursive Scan.repeat);
wenzelm
parents:
10746
diff
changeset
|
104 |
fun of_list xs = make_source [] xs default_prompt (fn _ => fn xs => (xs, [])); |
24064 | 105 |
fun of_list_limited n xs = make_source [] xs default_prompt (fn _ => chop n); |
6181 | 106 |
|
24064 | 107 |
val of_string = of_list o explode; |
23875
e22705ccc07d
added of_string_limited (more efficient for partial scans);
wenzelm
parents:
23700
diff
changeset
|
108 |
|
9123
f8f54877a18c
added exhausted: ('a, 'b) source -> ('a, 'a list) source;
wenzelm
parents:
8806
diff
changeset
|
109 |
fun exhausted src = of_list (exhaust src); |
f8f54877a18c
added exhausted: ('a, 'b) source -> ('a, 'a list) source;
wenzelm
parents:
8806
diff
changeset
|
110 |
|
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
111 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
112 |
(* stream source *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
113 |
|
24232
a70360a54e5c
stream source: non-critical, assuming exclusive ownership;
wenzelm
parents:
24064
diff
changeset
|
114 |
fun slurp_input instream = |
20737 | 115 |
let |
116 |
fun slurp () = |
|
117 |
(case TextIO.canInput (instream, 1) handle IO.Io _ => NONE of |
|
118 |
NONE => [] |
|
119 |
| SOME 0 => [] |
|
120 |
| SOME _ => TextIO.input instream :: slurp ()); |
|
24232
a70360a54e5c
stream source: non-critical, assuming exclusive ownership;
wenzelm
parents:
24064
diff
changeset
|
121 |
in maps explode (slurp ()) end; |
20737 | 122 |
|
25846 | 123 |
val tty = make_source [] () default_prompt (fn prompt => fn () => |
124 |
let val input = slurp_input TextIO.stdIn in |
|
20737 | 125 |
if exists (fn c => c = "\n") input then (input, ()) |
126 |
else |
|
25846 | 127 |
(case (Output.prompt prompt; TextIO.inputLine TextIO.stdIn) of |
25575 | 128 |
SOME line => (input @ explode line, ()) |
129 |
| NONE => (input, ())) |
|
25846 | 130 |
end); |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
131 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
132 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
133 |
|
23700
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
134 |
(** cascade sources **) |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
135 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
136 |
(* state-based *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
137 |
|
23700
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
138 |
fun drain_source' stopper scan opt_recover prompt (state, src) = |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
139 |
let |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
140 |
val drain = Scan.drain prompt get_prompt stopper; |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
141 |
val (xs, s) = get_prompt prompt src; |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
142 |
val inp = ((state, xs), s); |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
143 |
val ((ys, (state', xs')), src') = |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
144 |
if null xs then (([], (state, [])), s) |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
145 |
else |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
146 |
(case opt_recover of |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
147 |
NONE => drain (Scan.error scan) inp |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
148 |
| SOME (interactive, recover) => |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
149 |
(drain (Scan.catch scan) inp handle Fail msg => |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
150 |
(if interactive then Output.error_msg msg else (); |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
151 |
drain (Scan.unless (Scan.lift (Scan.one (#2 stopper))) (recover msg)) inp))); |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
152 |
in (ys, (state', unget (xs', src'))) end; |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
153 |
|
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
154 |
fun source' init_state stopper scan recover src = |
23700
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
155 |
make_source [] (init_state, src) default_prompt (drain_source' stopper scan recover); |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
156 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
157 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
158 |
(* non state-based *) |
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
159 |
|
23700
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
160 |
fun drain_source stopper scan opt_recover prompt = |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
161 |
Scan.unlift (drain_source' stopper (Scan.lift scan) |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
162 |
(Option.map (fn (int, r) => (int, Scan.lift o r)) opt_recover) prompt); |
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
163 |
|
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
164 |
fun source stopper scan recover src = |
23700
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
wenzelm
parents:
23682
diff
changeset
|
165 |
make_source [] src default_prompt (drain_source stopper scan recover); |
6116
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
166 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
167 |
|
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
wenzelm
parents:
diff
changeset
|
168 |
end; |