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