| author | huffman | 
| Thu, 03 Nov 2005 00:31:32 +0100 | |
| changeset 18072 | 102d4ebae879 | 
| parent 17802 | f3b1ca16cebd | 
| child 19064 | bf19cc5a7899 | 
| permissions | -rw-r--r-- | 
| 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 |