0 | module Text.Parse.Syntax
2 | import Text.Parse.Manual
15 | public export %inline
16 | pure : a -> Grammar False t e a
17 | pure v xs = Succ0 v xs
19 | public export %inline
20 | (<*>) : Grammar b1 t e (a -> b) -> Grammar b2 t e a -> Grammar (b1 || b2) t e b
22 | let Succ0 f r1 @{p} := gf xs | Fail0 err => Fail0 err
23 | Succ0 v r2 @{q} := ga r1 | Fail0 err => Fail0 err
24 | in Succ0 (f v) r2 @{swapOr $
trans q p}
26 | public export %inline
27 | (*>) : Grammar b1 t e () -> Grammar b2 t e a -> Grammar (b1 || b2) t e a
29 | let Succ0 () r1 @{p} := g1 xs | Fail0 err => Fail0 err
30 | Succ0 v r2 @{q} := g2 r1 | Fail0 err => Fail0 err
31 | in Succ0 v r2 @{swapOr $
trans q p}
34 | public export %inline
35 | seqt : Grammar b t e () -> Grammar True t e a -> Grammar True t e a
36 | seqt x y = orTrue $
x *> y
38 | public export %inline
39 | (<*) : Grammar b1 t e a -> Grammar b2 t e () -> Grammar (b1 || b2) t e a
41 | let Succ0 v r1 @{p} := g1 xs | Fail0 err => Fail0 err
42 | Succ0 () r2 @{q} := g2 r1 | Fail0 err => Fail0 err
43 | in Succ0 v r2 @{swapOr $
trans q p}
50 | public export %inline
51 | before : Interpolation t => Eq t => Grammar b t e a -> (c : t) -> Grammar True t e a
52 | before f c = orTrue $
f <* exact c
55 | public export %inline
56 | after : Interpolation t => Eq t => (o : t) -> Grammar b t e a -> Grammar True t e a
57 | after o f = exact o *> f
63 | public export %inline
64 | between : Interpolation t => Eq t => (o,c : t) -> Grammar b t e a -> Grammar True t e a
65 | between o c f (B x b :: xs) = case o == x of
66 | False => expected b o "\{x}"
68 | let Succ0 v (B y b2 :: ys) := succT (f xs) | res => failInParen b x res
69 | in if c == y then Succ0 v ys else unexpected (B y b2)
70 | between o c f [] = eoi
77 | optional : Grammar b t e a -> Grammar False t e (Maybe a)
78 | optional f ts = weaken $
(Just <$> f ts) <|> Succ0 Nothing ts @{Same}
82 | (fatal : InnerError e -> Bool)
83 | -> Grammar True t e a
85 | -> AccGrammar False t e (List a)
86 | manyOnto fatal f sx ts (SA r) = case f ts of
87 | Succ0 v ys => succF $
manyOnto fatal f (sx :< v) ys r
88 | Fail0 x => if fatal x.val then Fail0 x else Succ0 (sx <>> []) ts
96 | public export %inline
98 | (fatal : InnerError e -> Bool)
99 | -> Grammar True t e a
100 | -> Grammar False t e (List a)
101 | manyF fatal f ts = manyOnto fatal f [<] ts suffixAcc
109 | public export %inline
110 | many : Grammar True t e a -> Grammar False t e (List a)
111 | many = manyF (const False)
120 | public export %inline
122 | (fatal : InnerError e -> Bool)
123 | -> Grammar True t e a
124 | -> Grammar True t e (List1 a)
125 | someF fatal f = [| f ::: manyF fatal f|]
131 | public export %inline
132 | some : Grammar True t e a -> Grammar True t e (List1 a)
133 | some = someF (const False)
145 | public export %inline
147 | (fatal : InnerError e -> Bool)
148 | -> (sep : Grammar b t e ())
149 | -> Grammar True t e a
150 | -> Grammar True t e (List1 a)
151 | sepByF1 fatal sep f = [| f ::: manyF fatal (seqt sep f)|]
156 | public export %inline
162 | -> Grammar True t e a
163 | -> Grammar True t e (List1 a)
164 | sepByExact1 sep = sepByF1 isExp (exact sep)
166 | isExp : InnerError e -> Bool
167 | isExp (Expected [s] _) = s == interpolate sep