0 | module Parser.Support
 1 |
 2 | import public Libraries.Text.Lexer.Tokenizer
 3 | import public Libraries.Text.Lexer
 4 | import public Libraries.Text.Parser
 5 | import Libraries.Data.String.Extra
 6 | import public Libraries.Text.PrettyPrint.Prettyprinter
 7 |
 8 | import Core.TT
 9 | import Core.Core
10 | import Parser.Unlit
11 | import public Parser.Support.Escaping
12 |
13 | %default total
14 |
15 | export
16 | fromLitError : OriginDesc -> LiterateError -> Error
17 | fromLitError origin (MkLitErr l c _) = LitFail (MkFC origin (l, c) (l, c + 1))
18 |
19 | export
20 | fromLexError : OriginDesc -> (StopReason, Int, Int, String) -> Error
21 | fromLexError origin (ComposeNotClosing begin end, _, _, _)
22 |     = LexFail (MkFC origin begin end) "Bracket is not properly closed."
23 | fromLexError origin (_, l, c, _)
24 |     = LexFail (MkFC origin (l, c) (l, c + 1)) "Can't recognise token."
25 |
26 | export
27 | fromParsingErrors : (Show token, Pretty ann token) =>
28 |                     OriginDesc -> List1 (ParsingError token) -> Error
29 | fromParsingErrors origin = ParseFail . (map fromError)
30 |   where
31 |     fromError : ParsingError token -> (FC, String)
32 |     fromError (Error msg Nothing)
33 |         = (MkFC origin (0, 0) (0, 0), msg +> '.')
34 |     fromError (Error msg (Just t))
35 |         = let start = startBounds tend = endBounds t in
36 |             let fc = if start == end
37 |                       then MkFC origin start (mapSnd (+1) start)
38 |                       else MkFC origin start end
39 |             in (fc, msg +> '.')
40 |
41 | export
42 | getCharLit : String -> Maybe Char
43 | getCharLit str
44 |    = do e <- unescape 0 str
45 |         if length e == 1
46 |            then Just (assert_total (prim__strHead e))
47 |            else if length e == 0 -- parsed the NULL character that terminated the string!
48 |                    then Just '\0000'
49 |                    else Nothing
50 |