0 | module Language.JSON.String.Lexer
 1 |
 2 | import Data.Nat
 3 | import Language.JSON.String.Tokens
 4 | import Text.Lexer
 5 |
 6 | %default total
 7 |
 8 | export
 9 | quo : Lexer
10 | quo = is '"'
11 |
12 | export
13 | esc : Lexer -> Lexer
14 | esc = escape (is '\\')
15 |
16 | private
17 | unicodeEscape : Lexer
18 | unicodeEscape = esc $ is 'u' <+> count (exactly 4) hexDigit
19 |
20 | private
21 | simpleEscape : Lexer
22 | simpleEscape = esc $ oneOf "\"\\/bfnrt"
23 |
24 | private
25 | legalChar : Lexer
26 | legalChar = non (quo <|> is '\\' <|> control)
27 |
28 | private
29 | jsonStringTokenMap : TokenMap JSONStringToken
30 | jsonStringTokenMap = toTokenMap $
31 |   [ (quo, JSTQuote)
32 |   , (unicodeEscape, JSTUnicodeEscape)
33 |   , (simpleEscape, JSTSimpleEscape)
34 |   , (legalChar, JSTChar)
35 |   ]
36 |
37 | export
38 | lexString : String -> Maybe (List (WithBounds JSONStringToken))
39 | lexString x = case lex jsonStringTokenMap x of
40 |                    (toks, _, _, "") => Just $ toks
41 |                    _ => Nothing
42 |