3 | import public Text.ILex
5 | import Text.ILex.Char.UTF8
6 | import Text.ILex.Internal.Runner
7 | import Text.ILex.Runner1
11 | parameters (p : P1 q e a)
16 | appLast : PIx p -> PST p -> Maybe (PStep p) -> F1 q (Either e a)
18 | read1 (bytes @{p.hasb} sk) >>= \case
19 | BS 0 _ => p.eoi st sk
21 | Just f => lastStep p f st sk
22 | Nothing => fail p st sk
33 | {auto has : Has (ParseError e) es}
34 | -> {auto lft : ELift1 q f}
35 | -> (prs : P1 q (BoundedErr e) a)
36 | -> {auto hap : HasPosition prs.state}
38 | -> Pull f ByteString es x
40 | streamParse prs o pl = Prelude.do
41 | st <- lift1 (init prs)
42 | posprev <- lift1 {s = q} (getPosition @{st.stack} @{hap})
43 | prev <- readref {s = q} (bytes @{prs.hasb} st.stack)
44 | go prev posprev empty st pl
47 | toErr : ByteString -> Position -> ByteString -> BoundedErr e -> ParseError e
48 | toErr prev posprev bs (B x bnds) =
53 | let pos := incBytes prev posprev
54 | bs' := dropWhile (not . isStartByte) bs
55 | pos' := if bs'.size < bs.size then incCol pos else pos
56 | in PE o bnds (bnds `relativeTo` pos') (Just $
toString bs') x
64 | (prev0 : ByteString)
65 | -> (posprev0 : Position)
66 | -> (bs0 : ByteString)
68 | -> Pull f ByteString es x
70 | go prev0 posprev0 bs0 st p =
71 | assert_total $
P.uncons p >>= \case
73 | lift1 {s = q} (appLast prs st.state st.stack st.tok) >>= \case
74 | Left x => throw (toErr prev0 posprev0 bs0 x)
75 | Right v => emit v $> res
76 | Right (bs1,p2) => Prelude.do
77 | posprev1 <- lift1 {s = q} (getPosition @{st.stack} @{hap})
78 | prev1 <- readref {s = q} (bytes @{prs.hasb} st.stack)
79 | lift1 (pparseBytes prs st bs1) >>= \case
80 | Left x => throw (toErr prev0 posprev0 (bs0 <+> bs1) x)
81 | Right (st2,m) => consMaybe m (go prev1 posprev1 bs1 st2 p2)
85 | {auto has : Has (ParseError e) es}
86 | -> {auto lft : ELift1 q f}
88 | -> (prs : P1 q (BoundedErr e) a)
89 | -> {auto hap : HasPosition prs.state}
90 | -> {auto hab : HasBytes prs.state}
92 | -> Stream f es ByteString
94 | streamVal dflt prs o = P.lastOr dflt . streamParse prs o