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