src/Pure/General/lazy_scan.ML
author wenzelm
Thu, 07 Apr 2005 09:26:40 +0200
changeset 15665 7e7412fffc0c
parent 15663 6e6233e8cf5e
permissions -rw-r--r--
tuned updates, added map_entry;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15663
6e6233e8cf5e added header;
wenzelm
parents: 15531
diff changeset
     1
(*  Title:      Pure/General/lazy_scan.ML
6e6233e8cf5e added header;
wenzelm
parents: 15531
diff changeset
     2
    ID:         $Id$
6e6233e8cf5e added header;
wenzelm
parents: 15531
diff changeset
     3
    Author:     Sebastian Skalberg, TU Muenchen
6e6233e8cf5e added header;
wenzelm
parents: 15531
diff changeset
     4
6e6233e8cf5e added header;
wenzelm
parents: 15531
diff changeset
     5
Scanner combinators for lazy sequences.
6e6233e8cf5e added header;
wenzelm
parents: 15531
diff changeset
     6
*)
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
     7
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
     8
signature LAZY_SCAN =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
     9
sig
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    10
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    11
    exception SyntaxError
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    12
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    13
    type ('a,'b) scanner = 'a LazySeq.seq -> 'b * 'a LazySeq.seq
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    14
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    15
    val :--      : ('a,'b) scanner * ('b -> ('a,'c) scanner)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    16
		   -> ('a,'b*'c) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    17
    val --       : ('a,'b) scanner * ('a,'c) scanner -> ('a,'b*'c) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    18
    val >>       : ('a,'b) scanner * ('b -> 'c) -> ('a,'c) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    19
    val --|      : ('a,'b) scanner * ('a,'c) scanner -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    20
    val |--      : ('a,'b) scanner * ('a,'c) scanner -> ('a,'c) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    21
    val ^^       : ('a,string) scanner * ('a,string) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    22
		   -> ('a,string) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    23
    val ||       : ('a,'b) scanner * ('a,'b) scanner -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    24
    val one      : ('a -> bool) -> ('a,'a) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    25
    val succeed  : 'b -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    26
    val any      : ('a -> bool) -> ('a,'a list) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    27
    val any1     : ('a -> bool) -> ('a,'a list) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    28
    val optional : ('a,'b) scanner -> 'b -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    29
    val option   : ('a,'b) scanner -> ('a,'b option) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    30
    val repeat   : ('a,'b) scanner -> ('a,'b list) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    31
    val repeat1  : ('a,'b) scanner -> ('a,'b list) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    32
    val ahead    : ('a,'b) scanner -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    33
    val unless   : ('a LazySeq.seq -> bool) -> ('a,'b) scanner -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    34
    val $$       : ''a -> (''a,''a) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    35
    val !!       : ('a LazySeq.seq -> string) -> ('a,'b) scanner -> ('a,'b) scanner
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    36
    val scan_full: ('a,'b) scanner -> 'a LazySeq.seq -> 'b LazySeq.seq
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    37
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    38
end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    39
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    40
structure LazyScan :> LAZY_SCAN =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    41
struct
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    42
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    43
infix 7 |-- --|
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    44
infix 5 :-- -- ^^
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    45
infix 3 >>
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    46
infix 0 ||
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    47
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    48
exception SyntaxError
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    49
exception Fail of string
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    50
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    51
type ('a,'b) scanner = 'a LazySeq.seq -> 'b * 'a LazySeq.seq
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    52
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    53
fun (sc1 :-- sc2) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    54
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    55
	val (x,toks2) = sc1 toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    56
	val (y,toks3) = sc2 x toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    57
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    58
	((x,y),toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    59
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    60
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    61
fun (sc1 -- sc2) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    62
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    63
	val (x,toks2) = sc1 toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    64
	val (y,toks3) = sc2 toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    65
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    66
	((x,y),toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    67
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    68
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    69
fun (sc >> f) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    70
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    71
	val (x,toks2) = sc toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    72
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    73
	(f x,toks2)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    74
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    75
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    76
fun (sc1 --| sc2) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    77
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    78
	val (x,toks2) = sc1 toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    79
	val (_,toks3) = sc2 toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    80
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    81
	(x,toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    82
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    83
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    84
fun (sc1 |-- sc2) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    85
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    86
	val (_,toks2) = sc1 toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    87
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    88
	sc2 toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    89
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    90
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    91
fun (sc1 ^^ sc2) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    92
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    93
	val (x,toks2) = sc1 toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    94
	val (y,toks3) = sc2 toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    95
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    96
	(x^y,toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    97
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    98
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
    99
fun (sc1 || sc2) toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   100
    (sc1 toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   101
    handle SyntaxError => sc2 toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   102
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   103
fun one p toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   104
    case LazySeq.getItem toks of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   105
	NONE => raise SyntaxError
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   106
      | SOME(t,toks) => if p t
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   107
			then (t,toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   108
			else raise SyntaxError
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   109
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   110
fun succeed e toks = (e,toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   111
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   112
fun any p toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   113
    case LazySeq.getItem toks of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   114
	NONE =>  ([],toks)
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   115
      | SOME(x,toks2) => if p x
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   116
			 then
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   117
			     let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   118
				 val (xs,toks3) = any p toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   119
			     in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   120
				 (x::xs,toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   121
			     end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   122
			 else ([],toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   123
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   124
fun any1 p toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   125
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   126
	val (x,toks2) = one p toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   127
	val (xs,toks3) = any p toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   128
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   129
	(x::xs,toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   130
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   131
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   132
fun optional sc def =  sc || succeed def
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   133
fun option sc = (sc >> SOME) || succeed NONE
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   134
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   135
(*
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   136
fun repeat sc =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   137
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   138
	fun R toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   139
	    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   140
		val (x,toks2) = sc toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   141
		val (xs,toks3) = R toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   142
	    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   143
		(x::xs,toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   144
	    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   145
	    handle SyntaxError => ([],toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   146
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   147
	R
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   148
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   149
*)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   150
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   151
(* A tail-recursive version of repeat.  It is (ever so) slightly slower
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   152
 * than the above, non-tail-recursive version (due to the garbage generation
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   153
 * associated with the reversal of the list).  However,  this version will be
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   154
 * able to process input where the former version must give up (due to stack
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   155
 * overflow).  The slowdown seems to be around the one percent mark.
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   156
 *)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   157
fun repeat sc =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   158
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   159
	fun R xs toks =
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   160
	    case SOME (sc toks) handle SyntaxError => NONE of
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   161
		SOME (x,toks2) => R (x::xs) toks2
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   162
	      | NONE => (List.rev xs,toks)
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   163
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   164
	R []
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   165
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   166
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   167
fun repeat1 sc toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   168
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   169
	val (x,toks2) = sc toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   170
	val (xs,toks3) = repeat sc toks2
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   171
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   172
	(x::xs,toks3)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   173
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   174
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   175
fun ahead (sc:'a->'b*'a) toks = (#1 (sc toks),toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   176
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   177
fun unless test sc toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   178
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   179
	val test_failed = (test toks;false) handle SyntaxError => true
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   180
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   181
	if test_failed
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   182
	then sc toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   183
	else raise SyntaxError
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   184
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   185
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   186
fun $$ arg = one (fn x => x = arg)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   187
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   188
fun !! f sc toks = (sc toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   189
		    handle SyntaxError => raise Fail (f toks))
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   190
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   191
fun scan_full sc toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   192
    let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   193
	fun F toks =
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   194
	    if LazySeq.null toks
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   195
	    then NONE
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   196
	    else
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   197
		let
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   198
		    val (x,toks') = sc toks
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   199
		in
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14278
diff changeset
   200
		    SOME(x,LazySeq.make (fn () => F toks'))
14278
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   201
		end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   202
    in
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   203
	LazySeq.make (fn () => F toks)
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   204
    end
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   205
ae499452700a Added lazy sequences and parser combinators for same.
skalberg
parents:
diff changeset
   206
end