0 | module Language.JSON.Lexer
 1 |
 2 | import Language.JSON.String
 3 | import Text.Lexer
 4 |
 5 | import public Language.JSON.Tokens
 6 |
 7 | %default total
 8 |
 9 | private
10 | numberLit : Lexer
11 | numberLit
12 |   = let sign  = is '-'
13 |         whole = is '0' <|> range '1' '9' <+> many digit
14 |         frac  = is '.' <+> digits
15 |         exp   = like 'e' <+> opt (oneOf "+-") <+> digits in
16 |         opt sign <+> whole <+> opt frac <+> opt exp
17 |
18 | private
19 | jsonTokenMap : TokenMap JSONToken
20 | jsonTokenMap = toTokenMap $
21 |   [ (spaces, JTIgnore)
22 |   , (is ',', JTPunct Comma)
23 |   , (is ':', JTPunct Colon)
24 |   , (is '[', JTPunct $ Square Open)
25 |   , (is ']', JTPunct $ Square Close)
26 |   , (is '{', JTPunct $ Curly Open)
27 |   , (is '}', JTPunct $ Curly Close)
28 |   , (exact "null", JTNull)
29 |   , (exact strTrue <|> exact strFalse, JTBoolean)
30 |   , (numberLit, JTNumber)
31 |   , (permissiveStringLit, JTString)
32 |   ]
33 |
34 | export
35 | lexJSON : String -> Maybe (List (WithBounds JSONToken))
36 | lexJSON str
37 |   = case lex jsonTokenMap str of
38 |          (tokens, _, _, "") => Just $ tokens
39 |          _ => Nothing
40 |