0 | module Text.ILex.Runner
3 | import Text.ILex.Internal.Runner
4 | import public Text.ParseError
5 | import public Text.FC
6 | import public Text.ILex.Parser
7 | import public Text.ILex.Interfaces
13 | run : {n : _} -> Parser1 e a -> IBuffer n -> Either e a
17 | runString : Parser1 e a -> String -> Either e a
18 | runString l s = run l (fromString s)
22 | runBytes : Parser1 e a -> ByteString -> Either e a
23 | runBytes l (BS s bv) = run l (toIBuffer bv)
27 | runList : Parser1 e a -> List ByteString -> Either e a
35 | -> Parser1 (BBErr e) a
38 | -> Either (ParseError e) a
39 | parse l o buf = mapFst (toParseError o (toString buf 0 n)) (run l buf)
47 | -> Either (ParseError e) a
48 | parseString l o s = parse l o (fromString s)
56 | -> Either (ParseError e) a
57 | parseBytes l o bs = mapFst (toParseError o (toString bs)) (runBytes l bs)
69 | record LexState (p : P1 q e a) where
74 | dfa : PStepper sts p
75 | cur : PByteStep sts p
79 | init : (n : Nat) -> IBuffer n -> (p : P1 q e a) -> F1 q (LexState p)
81 | let stck # t := p.stck n buf t
82 | L _ dfa := p.lex `at` p.init
83 | in LST p.init stck dfa (dfa `at` 0) Err # t
89 | 0 LoopRes : (p : P1 q e a) -> Type
90 | LoopRes p = F1 q (Either e (LexState p))
93 | lastStep : (p : P1 q e a) -> LexState p -> F1 q (Either e a)
94 | lastStep p (LST st sk _ _ tok) t =
96 | Err => case getBytes @{p.hasb} t of
97 | BS 0 _ # t => p.eoi st sk t
98 | _ # t => fail p st sk t
100 | let st2 # t := f (E sk t)
101 | _ # t := toFinalPos @{p.hasb} t
104 | let _ # t := toFinalPos @{p.hasb} t
107 | parameters {0 q,e,a : Type}
109 | (parser : P1 q e a)
112 | (rfrom : Ref q (LTENat n))
113 | (rtill : Ref q (LTENat n))
116 | stp : Fun1 q parser.state x -> (0 till : Nat) -> Ix till n => F1 q x
118 | let _ # t := write1 rtill (lteNat till) t
123 | -> (dfa : PStepper k parser)
124 | -> (cur : PByteStep k parser)
126 | -> {auto posIx : Ix pos n}
131 | -> (dfa : PStepper k parser)
132 | -> (cur : PByteStep k parser)
133 | -> (last : PRun parser)
135 | -> {auto posIx : Ix pos n}
140 | -> (dfa : PStepper k parser)
141 | -> (cur : PByteStep k parser)
143 | -> {auto posIx : Ix pos n}
146 | loop : (st : PIx parser) -> (pos : Nat) -> (x : Ix pos n) => LoopRes parser
148 | let _ # t := write1 rfrom (lteNat 0) t
149 | _ # t := write1 rtill (lteNat 0) t
150 | L _ dfa := parser.lex `at` st
151 | in Right (LST st sk dfa (dfa `at` 0) Err) # t
153 | let _ # t := write1 rfrom (lteNat $
S k) t
154 | L _ dfa := parser.lex `at` st
156 | in case cur `atByte` (buf `ix` k) of
157 | Done f => let s2 # t := stp f k t in loop s2 k t
158 | Ignore => loop st k t
159 | Move nxt f => succ st dfa (dfa `at` nxt) f k t
160 | MoveI nxt => igno st dfa (dfa `at` nxt) k t
161 | MoveE nxt => step st dfa (dfa `at` nxt) k t
162 | _ => stp (failFun1 parser st) k t
164 | succ st dfa cur f 0 t =
165 | let _ # t := write1 rtill (lteNat 0) t
166 | in Right (LST st sk dfa cur (Run f)) # t
167 | succ st dfa cur f (S k) t =
168 | let byte := buf `ix` k
169 | in case cur `atByte` byte of
170 | Keep => succ st dfa cur f k t
171 | Done f => let s2 # t := stp f k t in loop s2 k t
172 | Ignore => loop st k t
173 | Move nxt f => succ st dfa (dfa `at` nxt) f k t
174 | MoveI nxt => igno st dfa (dfa `at` nxt) k t
175 | MoveE nxt => step st dfa (dfa `at` nxt) k t
176 | Bottom => let s2 # t := stp f (S k) t in loop s2 (S k) t
178 | igno st dfa cur 0 t =
179 | let _ # t := write1 rtill (lteNat 0) t
180 | in Right (LST st sk dfa cur Ign) # t
181 | igno st dfa cur (S k) t =
182 | let byte := buf `ix` k
183 | in case cur `atByte` byte of
184 | Keep => igno st dfa cur k t
185 | Done f => let s2 # t := stp f k t in loop s2 k t
186 | Ignore => loop st k t
187 | Move nxt f => succ st dfa (dfa `at` nxt) f k t
188 | MoveI nxt => igno st dfa (dfa `at` nxt) k t
189 | MoveE nxt => step st dfa (dfa `at` nxt) k t
190 | Bottom => loop st (S k) t
192 | step st dfa cur 0 t =
193 | let _ # t := write1 rtill (lteNat 0) t
194 | in Right (LST st sk dfa cur Err) # t
195 | step st dfa cur (S k) t =
196 | let byte := buf `ix` k
197 | in case cur `atByte` byte of
198 | Keep => step st dfa cur k t
199 | Done f => let s2 # t := stp f k t in loop s2 k t
200 | Ignore => loop st k t
201 | Move nxt f => succ st dfa (dfa `at` nxt) f k t
202 | MoveI nxt => igno st dfa (dfa `at` nxt) k t
203 | MoveE nxt => step st dfa (dfa `at` nxt) k t
204 | Bottom => stp (failFun1 parser st) k t
213 | stepState {n = 0} buf p lst t = Right lst # t
214 | stepState {n = S k} buf p (LST st skOld dfa cr tok) t =
215 | let bs # t := getBytes @{p.hasb} @{skOld} t
216 | BP o # t := startPos {hb = p.hasb, sk = skOld} t
217 | rf # t := ref1 (first $
S k) t
218 | rt # t := ref1 (first $
S k) t
219 | sk := Parser.copy @{p.hasb} (S k) o bs buf rf rt skOld
221 | in case cr `atByte` byte of
222 | Keep => case tok of
223 | Run f => succ p sk buf rf rt st dfa cr f k t
224 | Ign => igno p sk buf rf rt st dfa cr k t
225 | Err => step p sk buf rf rt st dfa cr k t
227 | let s2 # t := stp p sk buf rf rt f k t
228 | in loop p sk buf rf rt s2 k t
229 | Ignore => loop p sk buf rf rt st k t
230 | Move nxt f => succ p sk buf rf rt st dfa (dfa `at` nxt) f k t
231 | MoveI nxt => igno p sk buf rf rt st dfa (dfa `at` nxt) k t
232 | MoveE nxt => step p sk buf rf rt st dfa (dfa `at` nxt) k t
233 | Bottom => case tok of
235 | let s2 # t := stp p sk buf rf rt f (S k) t
236 | ske := Parser.copy @{p.hasb} (S k) (o+bs.size) empty buf rf rt sk
237 | in loop p ske buf rf rt s2 (S k) t
239 | let ske := Parser.copy @{p.hasb} (S k) (o+bs.size) empty buf rf rt sk
240 | in loop p ske buf rf rt st (S k) t
241 | Err => stp p sk buf rf rt (failFun1 p st) k t
245 | let lst # t := Runner.init n buf p t
246 | Right lst2 # t := stepState buf p lst t | Left x # t => Left x # t
247 | in lastStep p lst2 t
249 | loopAll : (p : P1 q e a) -> LexState p -> List ByteString -> F1 q (Either e a)
250 | loopAll p lst [] t = lastStep p lst t
251 | loopAll p lst (BS n bv :: xs) t =
252 | case stepState (toIBuffer bv) p lst t of
253 | Left x # t => Left x # t
254 | Right lst2 # t => loopAll p lst2 xs t
258 | let lst # t := Runner.init 0 empty p t
259 | in loopAll p lst bs t