mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-30 07:02:24 +03:00
42 lines
1.0 KiB
Idris
42 lines
1.0 KiB
Idris
|
module Language.JSON.Lexer
|
||
|
|
||
|
import Language.JSON.String
|
||
|
import Text.Lexer
|
||
|
import Text.Token
|
||
|
|
||
|
import public Language.JSON.Tokens
|
||
|
|
||
|
%default total
|
||
|
|
||
|
private
|
||
|
numberLit : Lexer
|
||
|
numberLit
|
||
|
= let sign = is '-'
|
||
|
whole = is '0' <|> range '1' '9' <+> many digit
|
||
|
frac = is '.' <+> digits
|
||
|
exp = like 'e' <+> opt (oneOf "+-") <+> digits in
|
||
|
opt sign <+> whole <+> opt frac <+> opt exp
|
||
|
|
||
|
private
|
||
|
jsonTokenMap : TokenMap JSONToken
|
||
|
jsonTokenMap = toTokenMap $
|
||
|
[ (spaces, JTIgnore)
|
||
|
, (is ',', JTPunct Comma)
|
||
|
, (is ':', JTPunct Colon)
|
||
|
, (is '[', JTPunct $ Square Open)
|
||
|
, (is ']', JTPunct $ Square Close)
|
||
|
, (is '{', JTPunct $ Curly Open)
|
||
|
, (is '}', JTPunct $ Curly Close)
|
||
|
, (exact "null", JTNull)
|
||
|
, (exact strTrue <|> exact strFalse, JTBoolean)
|
||
|
, (numberLit, JTNumber)
|
||
|
, (permissiveStringLit, JTString)
|
||
|
]
|
||
|
|
||
|
export
|
||
|
lexJSON : String -> Maybe (List JSONToken)
|
||
|
lexJSON str
|
||
|
= case lex jsonTokenMap str of
|
||
|
(tokens, _, _, "") => Just $ map TokenData.tok tokens
|
||
|
_ => Nothing
|