4 | module Language.TOML.Lexer
9 | import public Language.TOML.Tokens
14 | nonZeroDigit : Lexer
15 | nonZeroDigit = range '1' '9'
20 | = let sign = oneOf "+-"
21 | whole = is '0' <|> nonZeroDigit <+> many (opt (is '_') <+> digit)
22 | frac = the Lexer $
is '.' <+> digit <+> many (opt (is '_') <+> digit)
23 | exp = the Lexer $
like 'e' <+> opt (oneOf "+-") <+> digits
24 | constant = exact "nan" <|> exact "inf" in
26 | whole <+> ((frac <+> opt exp) <|> exp)
31 | sepIntLit = opt (oneOf "+-") <+> nonZeroDigit <+> many (is '_' <|> digit)
34 | sepBaseLit : (pre : String) -> (digit : Lexer) -> Lexer
35 | sepBaseLit pre digit =
38 | <+> many (opt (is '_') <+> digit)
43 | (sepBaseLit "0x" hexDigit
44 | <|> sepBaseLit "0o" octDigit
45 | <|> sepBaseLit "0b" binDigit
46 | <|> sepIntLit) <+> reject (oneOf ".eE")
50 | bareKey = some (alphaNum <|> is '_' <|> is '-')
54 | basicStringLit : Lexer
55 | basicStringLit = quote (is '"') (escape (is '\\') any <|> isNot '\\')
58 | tomlTokenMap : TokenMap TOMLToken
59 | tomlTokenMap = toTokenMap $
61 | (newline, TTPunct NewLine),
62 | (lineComment (is '#'), TTIgnored),
63 | (spaces, TTIgnored),
64 | (is ',', TTPunct Comma),
65 | (is '.', TTPunct Dot),
66 | (is '=', TTPunct Equal),
67 | (is '[', TTPunct $
Square Open),
68 | (is ']', TTPunct $
Square Close),
69 | (is '{', TTPunct $
Curly Open),
70 | (is '}', TTPunct $
Curly Close),
71 | (exact strTrue <|> exact strFalse, TTBoolean),
72 | (integerLit, TTInt),
73 | (floatLit, TTFloat),
75 | (Language.TOML.Lexer.basicStringLit, TTString Basic),
80 | lexTOML : String -> Maybe (List (WithBounds TOMLToken))
82 | case lex tomlTokenMap str of
83 | (tokens, (_, _, "")) => Just tokens