0 | module Text.Parse.Core
5 | import Data.List.Suffix
6 | import Derive.Prelude
7 | import Text.ParseError
10 | import Text.Lex.Core
11 | import Text.Lex.Tokenizer
13 | %language ElabReflection
25 | -> (ts : List $
Bounded t)
26 | -> (state,e,a : Type)
31 | -> {0 state,t,e,a : Type}
32 | -> {0 ts : List $
Bounded t}
33 | -> (consumed : Bool)
34 | -> (err : List1 $
Bounded $
InnerError e)
35 | -> Res b t ts state e a
39 | -> {0 state,t,e,a : Type}
40 | -> {0 ts : List $
Bounded t}
42 | -> (res : Bounded a)
43 | -> (toks : List $
Bounded t)
44 | -> (prf : Suffix b toks ts)
45 | -> Res b t ts state e a
47 | public export %inline
48 | FailParse (Res b t ts state e) e where
49 | parseFail b e = Fail False (B e b ::: [])
52 | merge : Bounded z -> Res b t ts s e a -> Res b t ts s e a
53 | merge x (Succ y res toks prf) = Succ y (x *> res) toks prf
57 | succ : Res b t ts s e a -> (p : Suffix True ts ts') -> Res b1 t ts' s e a
58 | succ (Fail c err) p = Fail c err
59 | succ (Succ x res toks prf) p = Succ x res toks (weakens $
orTrue $
trans prf p)
65 | public export %tcinline
66 | 0 inf : Bool -> Type -> Type
73 | -> (state,t,e,a : Type)
77 | {0 state,t,e,a : Type}
78 | -> (state -> (ts : List $
Bounded t) -> Res b t ts state e a)
79 | -> Grammar b state t e a
82 | {0 state,t,e,a : Type}
83 | -> Grammar True state t e (a -> b)
84 | -> Inf (Grammar b2 state t e a)
85 | -> Grammar True state t e b
88 | {0 state,t,e,a : Type}
89 | -> Grammar b1 state t e (a -> b)
90 | -> Grammar b2 state t e a
91 | -> Grammar (b1 || b2) state t e b
94 | {0 state,t,e,a : Type}
95 | -> Grammar True state t e a
96 | -> Inf (a -> Grammar b2 state t e b)
97 | -> Grammar True state t e b
100 | {0 state,t,e,a : Type}
101 | -> Grammar b1 state t e a
102 | -> (a -> Grammar b2 state t e b)
103 | -> Grammar (b1 || b2) state t e b
106 | {0 state,t,e,a : Type}
107 | -> Grammar True state t e a
108 | -> Inf (Grammar b2 state t e b)
109 | -> Grammar True state t e b
112 | {0 state,t,e,a : Type}
113 | -> Grammar b1 state t e a
114 | -> Grammar b2 state t e b
115 | -> Grammar (b1 || b2) state t e b
118 | {0 state,t,e,a : Type}
119 | -> Grammar b1 state t e a
120 | -> Lazy (Grammar b2 state t e a)
121 | -> Grammar (b1 && b2) state t e a
124 | {0 state,t,e,a : Type}
125 | -> Grammar b state t e a
126 | -> Grammar b state t e (Bounded a)
129 | {0 state,t,e,a : Type}
130 | -> Grammar b state t e a
131 | -> Grammar b state t e a
137 | public export %inline
138 | FailParse (Grammar b state t e) e where
139 | parseFail b err = Lift $
\_,_ => parseFail b err
145 | public export %inline
148 | -> {0 state,t,e,a : Type}
149 | -> Grammar b1 state t e a
150 | -> Lazy (Grammar b2 state t e a)
151 | -> Grammar (b1 && b2) state t e a
154 | public export %inline
155 | pure : {0 state,t,e,a : Type} -> (res : a) -> Grammar False state t e a
156 | pure res = Lift $
\s,ts => Succ s (pure res) ts Same
159 | Functor (Grammar b s t e) where
160 | map f g = rewrite sym (orFalseNeutral b) in g >>= pure . f
162 | public export %tcinline
164 | {0 state,t,e,a : Type}
166 | -> Grammar b1 state t e (a -> b)
167 | -> inf b1 (Grammar b2 state t e a)
168 | -> Grammar (b1 || b2) state t e b
169 | (<*>) {b1 = True} = AppEat
170 | (<*>) {b1 = False} = App
172 | public export %inline
175 | -> {0 state,t,e,a : Type}
176 | -> Grammar b1 state t e a
177 | -> Grammar b2 state t e b
178 | -> Grammar (b1 || b2) state t e b
179 | (*>) x y = x >>= \_ => y
181 | public export %inline
184 | -> {0 state,t,e,a : Type}
185 | -> Grammar b1 state t e a
186 | -> Grammar b2 state t e b
187 | -> Grammar (b1 || b2) state t e a
188 | (<*) x y = x >>= (y $>)
192 | nextIs : Lazy e -> (t -> Bool) -> Grammar False s t e t
193 | nextIs err f = Lift $
\s,cs => case cs of
195 | if f h.val then Succ s h (h::t) Same else custom h.bounds err
200 | peek : Grammar False s t e t
201 | peek = Lift $
\s,cs => case cs of
202 | h :: t => Succ s h (h::t) Same
207 | readHead : (t -> Either (InnerError e) a) -> Grammar True s t e a
208 | readHead f = Lift $
\s,cs => case cs of
209 | h :: t => case f h.val of
210 | Right v => Succ s (B v h.bounds) t %search
211 | Left err => parseFail h.bounds err
215 | public export %inline
216 | terminal : Interpolation t => (t -> Maybe a) -> Grammar True s t e a
217 | terminal f = readHead $
\h => case f h of
219 | Nothing => Left (Expected [] "\{h}")
223 | is : Interpolation t => Eq t => t -> Grammar True s t e ()
224 | is x = readHead $
\h => if x == h then Right () else Left (Expected ["\{x}"] "\{h}")
230 | {0 state,t,e,a : Type}
232 | -> Grammar b state t e a
233 | -> Grammar False state t e a
234 | option def g = rewrite sym (andFalseFalse b) in g <|> pure def
240 | {0 state,t,e,a : Type}
241 | -> Grammar b state t e a
242 | -> Grammar False state t e (Maybe a)
243 | optional = option Nothing . map Just
246 | some : Grammar True s t e a -> Grammar True s t e (List1 a)
249 | many : Grammar True s t e a -> Grammar False s t e (List a)
251 | some g = [| g ::: many g |]
253 | many g = map forget (some g) <|> pure []
259 | (end : Grammar b s t e x)
260 | -> (p : Grammar True s t e a )
261 | -> Grammar True s t e (List1 a)
267 | (end : Grammar b s t e x)
268 | -> (p : Grammar True s t e a )
269 | -> Grammar b s t e (List a)
271 | someTill end p = [| p ::: manyTill end p |]
274 | rewrite sym (andTrueNeutral b) in (end $> []) <|> (forget <$> someTill end p)
280 | (skip : Grammar True s t e x)
281 | -> (p : Grammar b s t e a )
282 | -> Grammar True s t e a
288 | (skip : Grammar True s t e x)
289 | -> (p : Grammar b s t e a )
290 | -> Grammar b s t e a
292 | afterSome skip p = [| (\_,x => x) skip (afterMany skip p) |]
294 | afterMany skip p = rewrite sym (andTrueNeutral b) in p <|> afterSome skip p
300 | -> (sep : Grammar True s t e s)
301 | -> (p : Grammar b s t e a)
302 | -> Grammar b s t e (List1 a)
303 | sepBy1 {b = True} sep p = [| p ::: many (sep *> p) |]
304 | sepBy1 {b = False} sep p = [| p ::: many (sep *> p) |]
311 | -> (sep : Grammar True s t e s)
312 | -> (p : Grammar b s t e a)
313 | -> Grammar False s t e (List a)
314 | sepBy sep p = option [] $
forget <$> sepBy1 sep p
321 | -> (sep : Grammar True s t e s)
322 | -> (p : Grammar b s t e a)
323 | -> Grammar b s t e (List1 a)
324 | sepEndBy1 sep p = rewrite sym (orFalseNeutral b) in sepBy1 sep p <* optional sep
331 | -> (sep : Grammar True s t e s)
332 | -> (p : Grammar b s t e a)
333 | -> Grammar False s t e (List a)
334 | sepEndBy sep p = option [] $
forget <$> sepEndBy1 sep p
339 | (sep : Grammar True s t e s)
340 | -> (p : Grammar b s t e a)
341 | -> Grammar True s t e (List1 a)
342 | endBy1 sep p = some $
rewrite sym (orTrueTrue b) in p <* sep
346 | (sep : Grammar True s t e s)
347 | -> (p : Grammar b s t e a)
348 | -> Grammar False s t e (List a)
349 | endBy sep p = option [] $
forget <$> endBy1 sep p
354 | (left : Grammar True s t e l)
355 | -> (right : Grammar True s t e r)
356 | -> (p : Grammar b s t e a)
357 | -> Grammar True s t e a
358 | between left right contents = left *> contents <* right
361 | {0 state,t,e,a : Type}
362 | -> Grammar b state t e a
364 | -> (consumed : Bool)
365 | -> (ts : List $
Bounded t)
366 | -> (0 sa : SuffixAcc ts)
367 | -> Res b t ts state e a
368 | prs (Lift f) s1 c1 ts1 _ = case f s1 ts1 of
369 | Fail c2 err => Fail (c1 || c2) err
370 | Succ x res toks prf => Succ x res toks prf
372 | prs (App x y) s1 c1 ts1 sa@(SA rec) = case prs x s1 c1 ts1 sa of
373 | Succ s2 rf ts1 Same => case prs y s2 c1 ts1 sa of
374 | Fail c2 err => Fail c2 err
375 | Succ s3 ra ts3 p3 => Succ s3 (rf <*> ra) ts3 p3
376 | Succ s2 rf ts2 (Uncons p2) => case prs y s2 True ts2 rec of
377 | Fail c2 err => Fail c2 err
378 | Succ s3 ra ts3 p3 => Succ s3 (rf <*> ra) ts3 (swapOr $
trans p3 (Uncons p2))
379 | Fail c2 err => Fail c2 err
381 | prs (AppEat x y) s1 c1 ts1 sa@(SA rec) = case prs x s1 c1 ts1 sa of
382 | Succ s2 rf ts2 p2 => case prs y s2 True ts2 rec of
383 | Fail c2 err => Fail c2 err
384 | Succ s3 ra ts3 p3 => Succ s3 (rf <*> ra) ts3 (swapOr $
trans p3 p2)
385 | Fail c2 err => Fail c2 err
387 | prs (BindEat x y) s1 c1 ts1 sa@(SA rec) = case prs x s1 c1 ts1 sa of
388 | Succ s2 res ts2 p => merge res $
succ (prs (y res.val) s2 True ts2 rec) p
389 | Fail c2 err => Fail c2 err
391 | prs (x >>= y) s1 c1 ts1 sa@(SA rec) = case prs x s1 c1 ts1 sa of
392 | Succ s2 res ts2 (Uncons p) =>
393 | merge res $
succ (prs (y res.val) s2 True ts2 rec) (Uncons p)
394 | Succ s2 res ts2 Same => merge res $
prs (y res.val) s2 c1 ts2 sa
395 | Fail c2 err => Fail c2 err
397 | prs (ThenEat x y) s1 c1 ts1 sa@(SA rec) = case prs x s1 c1 ts1 sa of
398 | Succ s2 res ts2 p => merge res $
succ (prs y s2 True ts2 rec) p
399 | Fail c2 err => Fail c2 err
401 | prs (x >> y) s1 c1 ts1 sa@(SA rec) = case prs x s1 c1 ts1 sa of
402 | Succ s2 res ts2 (Uncons p) =>
403 | merge res $
succ (prs y s2 True ts2 rec) (Uncons p)
404 | Succ s2 res ts2 Same => merge res $
prs y s2 c1 ts2 sa
405 | Fail c2 err => Fail c2 err
407 | prs (Alt x y) s1 c1 ts1 sa = case prs x s1 False ts1 sa of
408 | Succ s2 res ts2 p => Succ s2 res ts2 (and1 p)
409 | Fail True err => Fail True err
410 | Fail {b = b1} False err => case prs y s1 False ts1 sa of
411 | Succ s2 res ts2 p => Succ s2 res ts2 (and2 p)
412 | Fail True err2 => Fail True err2
413 | Fail False err2 => Fail c1 $
err ++ err2
415 | prs (Bounds x) s1 c1 ts1 sa = case prs x s1 c1 ts1 sa of
416 | Succ s2 res ts2 p => Succ s2 (B res res.bounds) ts2 p
417 | Fail c2 err => Fail c2 err
419 | prs (Try x) s1 c1 ts1 sa = case prs x s1 c1 ts1 sa of
420 | Fail _ err => Fail False err
425 | {0 state,t,e,a : Type}
426 | -> Grammar b state t e a
428 | -> (ts : List $
Bounded t)
429 | -> Either (List1 $
Bounded $
InnerError e) (state, a, List $
Bounded t)
430 | parse g s ts = case prs g s False ts suffixAcc of
431 | Fail _ errs => Left errs
432 | Succ x res toks prf => Right (x, res.val, toks)
441 | -> SnocList (Bounded t)
442 | -> List (Bounded t)
443 | filterOnto xs f (sx :< x) =
444 | if f x.val then filterOnto (x :: xs) f sx else filterOnto xs f sx
445 | filterOnto xs f [<] = xs
452 | {auto int : Interpolation t}
455 | -> (keep : t -> Bool)
457 | -> Either (Bounded $
InnerError e) (List $
Bounded t)
458 | lexFull orig tm keep s = case lex tm s of
459 | TR pos toks Nothing _ _ => Right $
filterOnto [] keep toks
460 | TR _ _ (Just err) _ _ => Left err
464 | {0 state,t,e,a : Type}
465 | -> {auto int : Interpolation t}
468 | -> (keep : t -> Bool)
469 | -> Grammar b state t e a
472 | -> Either (List1 (FileContext, InnerError e)) (state, a)
473 | lexAndParse orig tm keep gr s str =
474 | let Right ts := lexFull orig tm keep str
475 | | Left err => Left $
singleton (fromBounded orig err)
476 | in case parse gr s ts of
477 | Left x => Left $
fromBounded orig <$> x
478 | Right (s2,a,_) => Right (s2,a)