0 | module Text.Lex.Shift
5 | import public Text.Lex.Manual
6 | import public Data.List.Shift
12 | public export %inline
13 | shift : Position -> Shift b t sx xs sy ys -> Position
14 | shift p s = addCol (toNat s) p
30 | -> (sc : SnocList Char)
35 | -> {0 st : SnocList Char}
36 | -> {0 ts : List Char}
37 | -> {pre : SnocList Char}
38 | -> (post : List Char)
39 | -> {auto sh : Shift b Char pre post st ts}
44 | -> {0 st,se,ee : SnocList Char}
45 | -> {ts,errStart : List Char}
46 | -> (start : Shift False Char se errStart st ts)
47 | -> (0 errEnd : List Char)
48 | -> {auto end : Shift False Char ee errEnd se errStart}
52 | public export %inline
53 | suffix : (SnocList Char -> a) -> ShiftRes True [<] cs -> LexRes True cs e a
54 | suffix f (Succ {pre} post @{sh}) = Succ (f pre) post @{suffix sh}
55 | suffix f (Stop s e x @{sh}) = Fail (suffix s) e (fromVoid x) @{suffix sh}
62 | swapOr : {0 x,y : _} -> ShiftRes (x || y) st ts -> ShiftRes (y || x) st ts
63 | swapOr = swapOr (\k => ShiftRes k st ts)
65 | public export %inline
66 | orSame : {0 x : _} -> ShiftRes (x || x) st ts -> ShiftRes x st ts
67 | orSame = orSame (\k => ShiftRes k st ts)
69 | public export %inline
70 | orTrue : {0 x : _} -> ShiftRes (x || True) st ts -> ShiftRes True st ts
71 | orTrue = orTrue (\k => ShiftRes k st ts)
73 | public export %inline
74 | orFalse : {0 x : _} -> ShiftRes (x || False) st ts -> ShiftRes x st ts
75 | orFalse = orFalse (\k => ShiftRes k st ts)
77 | public export %inline
78 | swapAnd : {0 x,y : _} -> ShiftRes (x && y) st ts -> ShiftRes (y && x) st ts
79 | swapAnd = swapAnd (\k => ShiftRes k st ts)
81 | public export %inline
82 | andSame : {0 x : _} -> ShiftRes (x && x) st ts -> ShiftRes x st ts
83 | andSame = andSame (\k => ShiftRes k st ts)
85 | public export %inline
86 | andTrue : {0 x : _} -> ShiftRes (x && True) st ts -> ShiftRes x st ts
87 | andTrue = andTrue (\k => ShiftRes k st ts)
89 | public export %inline
90 | andFalse : {0 x : _} -> ShiftRes (x && False) st ts -> ShiftRes False st ts
91 | andFalse = andFalse (\k => ShiftRes k st ts)
94 | weaken : {0 x : _} -> ShiftRes x st ts -> ShiftRes False st ts
95 | weaken (Succ xs @{p}) = Succ xs @{weaken p}
96 | weaken (Stop s e r) = Stop s e r
99 | weakens : {0 x : _} -> ShiftRes True st ts -> ShiftRes x st ts
100 | weakens (Succ xs @{p}) = Succ xs @{weakens p}
101 | weakens (Stop s e r) = Stop s e r
104 | and1 : {0 x : _} -> ShiftRes x st ts -> ShiftRes (x && y) st ts
105 | and1 (Succ xs @{p})= Succ xs @{and1 p}
106 | and1 (Stop s e r) = Stop s e r
108 | public export %inline
109 | and2 : {0 x : _} -> ShiftRes x st ts -> ShiftRes (y && x) st ts
110 | and2 r = swapAnd $
and1 r
112 | public export %inline
115 | -> ShiftRes b1 sx xs
116 | -> Shift b2 Char sx xs sy ys
117 | -> ShiftRes (b1 || b2) sy ys
118 | trans (Succ ts @{p}) q = Succ ts @{Shift.trans p q}
119 | trans (Stop x y z @{p}) q = Stop (weaken $
trans x q) y z
128 | -> Lazy (ShiftRes b2 sx xs)
129 | -> ShiftRes (b1 && b2) sx xs
130 | s@(Succ {}) <|> _ = and1 s
144 | 0 Shifter : (b : Bool) -> Type
145 | Shifter b = (st : SnocList Char) -> (ts : List Char) -> ShiftRes b st ts
148 | 0 AutoShift : Bool -> Type
151 | -> {0 giro : SnocList Char}
152 | -> {orig : List Char}
153 | -> {pre : SnocList Char}
154 | -> (post : List Char)
155 | -> {auto sh : Shift b Char pre post giro orig}
156 | -> ShiftRes (s || b) giro orig
161 | -> {0 giro,ruc,tser : SnocList Char}
162 | -> {orig,cur : List Char}
163 | -> (err : InnerError Void)
164 | -> (shiftCur : Shift b1 Char ruc cur giro orig)
165 | -> (0 rest : List Char)
166 | -> {auto sr : Shift False Char tser rest ruc cur}
167 | -> ShiftRes b2 giro orig
168 | range r sc rest = Stop (weaken sc) rest r
170 | public export %inline
173 | -> {0 giro,ruc,tser : SnocList Char}
174 | -> {orig,cur : List Char}
175 | -> (shiftCur : Shift b1 Char ruc cur giro orig)
176 | -> (0 rest : List Char)
177 | -> {auto sr : Shift False Char tser rest ruc cur}
178 | -> ShiftRes b2 giro orig
179 | invalidEscape = range InvalidEscape
181 | public export %inline
184 | -> {0 giro,ruc,tser : SnocList Char}
185 | -> {orig,cur : List Char}
186 | -> (shiftCur : Shift b1 Char ruc cur giro orig)
187 | -> (0 rest : List Char)
188 | -> {auto sr : Shift False Char tser rest ruc cur}
189 | -> ShiftRes b2 giro orig
190 | unknownRange sc ee = range (Unknown . packPrefix $
suffix sr) sc ee
192 | public export %inline
195 | -> {0 giro,ruc : SnocList Char}
197 | -> {orig,errEnd : List Char}
198 | -> (err : InnerError Void)
199 | -> (shiftCur : Shift b Char ruc (c::errEnd) giro orig)
200 | -> ShiftRes bres giro orig
201 | single r p = range r p errEnd
203 | public export %inline
206 | -> {0 giro,ruc : SnocList Char}
208 | -> {orig,errEnd : List Char}
209 | -> (shiftCur : Shift b Char ruc (c::errEnd) giro orig)
210 | -> ShiftRes bres giro orig
211 | unknown p = unknownRange p errEnd
213 | public export %inline
216 | -> {0 giro,ruc : SnocList Char}
218 | -> {orig,errEnd : List Char}
219 | -> (class : CharClass)
220 | -> (shiftCur : Shift b Char ruc (c::errEnd) giro orig)
221 | -> ShiftRes bres giro orig
222 | failCharClass cc = single (ExpectedChar cc)
224 | public export %inline
227 | -> {0 giro,ruc : SnocList Char}
229 | -> {orig,errEnd : List Char}
230 | -> (tpe : DigitType)
231 | -> (shiftCur : Shift b Char ruc (c::errEnd) giro orig)
232 | -> ShiftRes bres giro orig
233 | failDigit = failCharClass . Digit
238 | -> {0 ruc,giro : SnocList Char}
239 | -> {orig : List Char}
240 | -> (shiftCur : Shift b1 Char ruc [] giro orig)
241 | -> ShiftRes b2 giro orig
242 | eoiAt sc = range EOI sc []
250 | eoi : Shifter False
252 | eoi _ (x::xs) = single ExpectedEOI Same
256 | fail : Shifter True
257 | fail _ [] = eoiAt Same
258 | fail _ (x::xs) = unknown Same
263 | one : (Char -> Bool) -> AutoShift True
264 | one f (x :: xs) = if f x then Succ xs else unknown sh
265 | one _ [] = eoiAt sh
270 | takeWhile : (Char -> Bool) -> AutoShift False
271 | takeWhile f (x :: xs) = if f x then takeWhile f xs else Succ (x::xs)
272 | takeWhile f [] = Succ []
276 | takeWhile1 : (Char -> Bool) -> AutoShift True
277 | takeWhile1 f (x :: xs) = if f x then takeWhile f xs else unknown sh
278 | takeWhile1 f [] = eoiAt sh
283 | takeUntil : (Char -> Bool) -> AutoShift False
284 | takeUntil f (x :: xs) = if f x then Succ (x::xs) else takeUntil f xs
285 | takeUntil f [] = Succ []
289 | takeUntil1 : (Char -> Bool) -> AutoShift True
290 | takeUntil1 f (x :: xs) = if f x then unknown sh else takeUntil f xs
291 | takeUntil1 f [] = eoiAt sh
295 | digits : AutoShift False
296 | digits (x :: xs) = if isDigit x then digits xs else Succ (x::xs)
297 | digits [] = Succ []
301 | digits1 : AutoShift True
302 | digits1 (x :: xs) = if isDigit x then digits xs else failDigit Dec sh
303 | digits1 [] = eoiAt sh
307 | int : AutoShift True
308 | int ('-' :: xs) = digits1 {b} xs
309 | int xs = digits1 {b} xs
313 | intPlus : AutoShift True
314 | intPlus ('+' :: xs) = digits1 {b} xs
315 | intPlus xs = int {b} xs
317 | dot,rest,digs,exp : AutoShift False
318 | exp ('e' :: xs) = weakens $
intPlus {b} xs
319 | exp ('E' :: xs) = weakens $
intPlus {b} xs
321 | if isDigit x then unknownRange Same xs else Succ (x::xs)
324 | dot (x :: xs) = if isDigit x then dot xs else exp (x::xs)
327 | rest ('.'::x::xs) =
328 | if isDigit x then dot xs else failDigit Dec (shift sh)
329 | rest ('.'::[]) = eoiAt (shift sh)
332 | digs (x :: xs) = if isDigit x then digs xs else rest (x::xs)
337 | number : Shifter True
338 | number sc ('-' :: '0' :: xs) = rest xs
339 | number sc ('-' :: x :: xs) =
340 | if isDigit x then digs xs else failDigit Dec (shift Same)
341 | number sc ('0' :: xs) = rest xs
342 | number sc (x :: xs) = if isDigit x then digs xs else unknown Same
343 | number sc [] = eoiAt Same
346 | double : Tok True e Double
347 | double cs = suffix (cast . cast {to = String}) $
number [<] cs
350 | take : (n : Nat) -> {auto 0 p : IsSucc n} -> AutoShift True
351 | take (S Z) (x::xs) = Succ xs
352 | take (S k@(S _)) (x :: xs) = take {b} k xs
353 | take (S k) [] = eoiAt sh
356 | tail : AutoShift True
357 | tail (x::xs) = Succ xs
361 | exact : (ts : List Char) -> {auto 0 p : NonEmpty ts} -> AutoShift True
362 | exact (v :: vs) (x :: xs) = case v == x of
365 | ws@(_::_) => exact {b} ws xs
366 | False => single (Expected [String.singleton v] (String.singleton x)) sh
367 | exact (v :: vs) [] = eoiAt sh
369 | str : AutoShift True
370 | str ('"' :: xs) = Succ xs
371 | str ('\\' :: x :: xs) = str {b} xs
372 | str (x :: xs) = str {b} xs
376 | string : Shifter True
377 | string sc ('"' :: xs) = str {b = True} xs
378 | string sc (h :: t) = single (Expected ["\""] (String.singleton h)) Same
379 | string sc [] = eoiAt Same