module Data.ConfigFile.Lexer
(
loken,
CPTok(..)
) where
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Utils
data CPTok = IGNOREDATA
| NEWSECTION String
| NEWSECTION_EOF String
| EXTENSIONLINE String
| NEWOPTION (String, String)
deriving (CPTok -> CPTok -> Bool
(CPTok -> CPTok -> Bool) -> (CPTok -> CPTok -> Bool) -> Eq CPTok
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CPTok -> CPTok -> Bool
== :: CPTok -> CPTok -> Bool
$c/= :: CPTok -> CPTok -> Bool
/= :: CPTok -> CPTok -> Bool
Eq, Int -> CPTok -> ShowS
[CPTok] -> ShowS
CPTok -> [Char]
(Int -> CPTok -> ShowS)
-> (CPTok -> [Char]) -> ([CPTok] -> ShowS) -> Show CPTok
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CPTok -> ShowS
showsPrec :: Int -> CPTok -> ShowS
$cshow :: CPTok -> [Char]
show :: CPTok -> [Char]
$cshowList :: [CPTok] -> ShowS
showList :: [CPTok] -> ShowS
Show, Eq CPTok
Eq CPTok
-> (CPTok -> CPTok -> Ordering)
-> (CPTok -> CPTok -> Bool)
-> (CPTok -> CPTok -> Bool)
-> (CPTok -> CPTok -> Bool)
-> (CPTok -> CPTok -> Bool)
-> (CPTok -> CPTok -> CPTok)
-> (CPTok -> CPTok -> CPTok)
-> Ord CPTok
CPTok -> CPTok -> Bool
CPTok -> CPTok -> Ordering
CPTok -> CPTok -> CPTok
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CPTok -> CPTok -> Ordering
compare :: CPTok -> CPTok -> Ordering
$c< :: CPTok -> CPTok -> Bool
< :: CPTok -> CPTok -> Bool
$c<= :: CPTok -> CPTok -> Bool
<= :: CPTok -> CPTok -> Bool
$c> :: CPTok -> CPTok -> Bool
> :: CPTok -> CPTok -> Bool
$c>= :: CPTok -> CPTok -> Bool
>= :: CPTok -> CPTok -> Bool
$cmax :: CPTok -> CPTok -> CPTok
max :: CPTok -> CPTok -> CPTok
$cmin :: CPTok -> CPTok -> CPTok
min :: CPTok -> CPTok -> CPTok
Ord)
comment_chars :: CharParser st Char
= [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
oneOf [Char]
"#;"
eol :: GenParser Char st String
eol :: forall st. GenParser Char st [Char]
eol = [Char] -> ParsecT [Char] st Identity [Char]
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
string [Char]
"\n" ParsecT [Char] st Identity [Char]
-> ParsecT [Char] st Identity [Char]
-> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> [Char] -> ParsecT [Char] st Identity [Char]
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
string [Char]
"\r\n" ParsecT [Char] st Identity [Char]
-> ParsecT [Char] st Identity [Char]
-> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> [Char] -> ParsecT [Char] st Identity [Char]
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
string [Char]
"\r" ParsecT [Char] st Identity [Char]
-> [Char] -> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"End of line"
eoleof :: GenParser Char st ()
eoleof :: forall st. GenParser Char st ()
eoleof = ParsecT [Char] st Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT [Char] st Identity ()
-> ParsecT [Char] st Identity () -> ParsecT [Char] st Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do {GenParser Char st [Char]
forall st. GenParser Char st [Char]
eol; () -> ParsecT [Char] st Identity ()
forall a. a -> ParsecT [Char] st Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ()}
optionsep :: GenParser Char st Char
optionsep :: forall st. CharParser st Char
optionsep = [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
oneOf [Char]
":=" ParsecT [Char] st Identity Char
-> [Char] -> ParsecT [Char] st Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"option separator"
whitespace_chars :: GenParser Char st Char
whitespace_chars :: forall st. CharParser st Char
whitespace_chars = [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
oneOf [Char]
" \t" ParsecT [Char] st Identity Char
-> [Char] -> ParsecT [Char] st Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"whitespace"
comment_line :: GenParser Char st ()
= do ParsecT [Char] st Identity Char -> GenParser Char st ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT [Char] st Identity Char
forall st. CharParser st Char
whitespace_chars
ParsecT [Char] st Identity Char
forall st. CharParser st Char
comment_chars ParsecT [Char] st Identity Char
-> [Char] -> ParsecT [Char] st Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"start of comment"
(ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char])
-> ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
noneOf [Char]
"\r\n") ParsecT [Char] st Identity [Char]
-> [Char] -> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"content of comment"
GenParser Char st ()
forall st. GenParser Char st ()
eoleof
eolstuff :: GenParser Char st ()
eolstuff :: forall st. GenParser Char st ()
eolstuff = (GenParser Char st () -> GenParser Char st ()
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st ()
forall st. GenParser Char st ()
comment_line) GenParser Char st ()
-> GenParser Char st () -> GenParser Char st ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (GenParser Char st () -> GenParser Char st ()
forall tok st a. GenParser tok st a -> GenParser tok st a
try GenParser Char st ()
forall st. GenParser Char st ()
empty_line)
empty_line :: GenParser Char st ()
empty_line :: forall st. GenParser Char st ()
empty_line = do ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT [Char] st Identity Char
forall st. CharParser st Char
whitespace_chars
ParsecT [Char] st Identity ()
forall st. GenParser Char st ()
eoleof
ParsecT [Char] st Identity ()
-> [Char] -> ParsecT [Char] st Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"empty line"
sectheader_chars :: CharParser st Char
= [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
noneOf [Char]
"]\r\n"
sectheader :: GenParser Char st String
= do Char -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'['
[Char]
sname <- ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char])
-> ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall a b. (a -> b) -> a -> b
$ ParsecT [Char] st Identity Char
forall st. CharParser st Char
sectheader_chars
Char -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']'
GenParser Char st ()
forall st. GenParser Char st ()
eolstuff
[Char] -> ParsecT [Char] st Identity [Char]
forall a. a -> ParsecT [Char] st Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
sname
ParsecT [Char] st Identity [Char]
-> [Char] -> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"start of section"
oname_chars :: CharParser st Char
oname_chars :: forall st. CharParser st Char
oname_chars = [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
noneOf [Char]
":=\r\n"
value_chars :: CharParser st Char
value_chars :: forall st. CharParser st Char
value_chars = [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
noneOf [Char]
"\r\n"
extension_line :: GenParser Char st String
extension_line :: forall st. GenParser Char st [Char]
extension_line = do ParsecT [Char] st Identity Char -> GenParser Char st [Char]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT [Char] st Identity Char
forall st. CharParser st Char
whitespace_chars
Char
c1 <- [Char] -> ParsecT [Char] st Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m Char
noneOf [Char]
"\r\n#;"
[Char]
remainder <- ParsecT [Char] st Identity Char -> GenParser Char st [Char]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT [Char] st Identity Char
forall st. CharParser st Char
value_chars
GenParser Char st ()
forall st. GenParser Char st ()
eolstuff
[Char] -> GenParser Char st [Char]
forall a. a -> ParsecT [Char] st Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
c1 Char -> ShowS
forall a. a -> [a] -> [a]
: [Char]
remainder)
optionkey, optionvalue :: GenParser Char st String
optionkey :: forall st. GenParser Char st [Char]
optionkey = ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT [Char] st Identity Char
forall st. CharParser st Char
oname_chars
optionvalue :: forall st. GenParser Char st [Char]
optionvalue = ParsecT [Char] st Identity Char
-> ParsecT [Char] st Identity [Char]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT [Char] st Identity Char
forall st. CharParser st Char
value_chars
optionpair :: GenParser Char st (String, String)
optionpair :: forall st. GenParser Char st ([Char], [Char])
optionpair = do [Char]
key <- GenParser Char st [Char]
forall st. GenParser Char st [Char]
optionkey
[Char]
value <- [Char] -> GenParser Char st [Char] -> GenParser Char st [Char]
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option [Char]
"" (GenParser Char st [Char] -> GenParser Char st [Char])
-> GenParser Char st [Char] -> GenParser Char st [Char]
forall a b. (a -> b) -> a -> b
$ do { GenParser Char st Char
forall st. CharParser st Char
optionsep; GenParser Char st [Char]
forall st. GenParser Char st [Char]
optionvalue }
GenParser Char st ()
forall st. GenParser Char st ()
eolstuff
([Char], [Char]) -> ParsecT [Char] st Identity ([Char], [Char])
forall a. a -> ParsecT [Char] st Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Char]
key, [Char]
value)
ParsecT [Char] st Identity ([Char], [Char])
-> [Char] -> ParsecT [Char] st Identity ([Char], [Char])
forall s u (m :: * -> *) a.
ParsecT s u m a -> [Char] -> ParsecT s u m a
<?> [Char]
"key/value option"
iloken :: Parser (GeneralizedToken CPTok)
iloken :: Parser (GeneralizedToken CPTok)
iloken =
Parser (GeneralizedToken CPTok) -> Parser (GeneralizedToken CPTok)
forall tok st a. GenParser tok st a -> GenParser tok st a
try (do {GenParser Char () ()
forall st. GenParser Char st ()
comment_line; CPTok -> Parser (GeneralizedToken CPTok)
forall a b st. a -> GenParser b st (GeneralizedToken a)
togtok (CPTok -> Parser (GeneralizedToken CPTok))
-> CPTok -> Parser (GeneralizedToken CPTok)
forall a b. (a -> b) -> a -> b
$ CPTok
IGNOREDATA})
Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser (GeneralizedToken CPTok) -> Parser (GeneralizedToken CPTok)
forall tok st a. GenParser tok st a -> GenParser tok st a
try (do {GenParser Char () ()
forall st. GenParser Char st ()
empty_line; CPTok -> Parser (GeneralizedToken CPTok)
forall a b st. a -> GenParser b st (GeneralizedToken a)
togtok (CPTok -> Parser (GeneralizedToken CPTok))
-> CPTok -> Parser (GeneralizedToken CPTok)
forall a b. (a -> b) -> a -> b
$ CPTok
IGNOREDATA})
Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (do {[Char]
sname <- GenParser Char () [Char]
forall st. GenParser Char st [Char]
sectheader; CPTok -> Parser (GeneralizedToken CPTok)
forall a b st. a -> GenParser b st (GeneralizedToken a)
togtok (CPTok -> Parser (GeneralizedToken CPTok))
-> CPTok -> Parser (GeneralizedToken CPTok)
forall a b. (a -> b) -> a -> b
$ [Char] -> CPTok
NEWSECTION [Char]
sname})
Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser (GeneralizedToken CPTok) -> Parser (GeneralizedToken CPTok)
forall tok st a. GenParser tok st a -> GenParser tok st a
try (do {[Char]
extension <- GenParser Char () [Char]
forall st. GenParser Char st [Char]
extension_line; CPTok -> Parser (GeneralizedToken CPTok)
forall a b st. a -> GenParser b st (GeneralizedToken a)
togtok (CPTok -> Parser (GeneralizedToken CPTok))
-> CPTok -> Parser (GeneralizedToken CPTok)
forall a b. (a -> b) -> a -> b
$ [Char] -> CPTok
EXTENSIONLINE [Char]
extension})
Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
-> Parser (GeneralizedToken CPTok)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser (GeneralizedToken CPTok) -> Parser (GeneralizedToken CPTok)
forall tok st a. GenParser tok st a -> GenParser tok st a
try (do {([Char], [Char])
pair <- GenParser Char () ([Char], [Char])
forall st. GenParser Char st ([Char], [Char])
optionpair; CPTok -> Parser (GeneralizedToken CPTok)
forall a b st. a -> GenParser b st (GeneralizedToken a)
togtok (CPTok -> Parser (GeneralizedToken CPTok))
-> CPTok -> Parser (GeneralizedToken CPTok)
forall a b. (a -> b) -> a -> b
$ ([Char], [Char]) -> CPTok
NEWOPTION ([Char], [Char])
pair})
loken :: Parser [GeneralizedToken CPTok]
loken :: Parser [GeneralizedToken CPTok]
loken = do [GeneralizedToken CPTok]
x <- Parser (GeneralizedToken CPTok)
-> GenParser Char () () -> Parser [GeneralizedToken CPTok]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill Parser (GeneralizedToken CPTok)
iloken GenParser Char () ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
[GeneralizedToken CPTok] -> Parser [GeneralizedToken CPTok]
forall a. a -> ParsecT [Char] () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ([GeneralizedToken CPTok] -> Parser [GeneralizedToken CPTok])
-> [GeneralizedToken CPTok] -> Parser [GeneralizedToken CPTok]
forall a b. (a -> b) -> a -> b
$ (GeneralizedToken CPTok -> Bool)
-> [GeneralizedToken CPTok] -> [GeneralizedToken CPTok]
forall a. (a -> Bool) -> [a] -> [a]
filter (\GeneralizedToken CPTok
y -> GeneralizedToken CPTok -> CPTok
forall a b. (a, b) -> b
snd GeneralizedToken CPTok
y CPTok -> CPTok -> Bool
forall a. Eq a => a -> a -> Bool
/= CPTok
IGNOREDATA) [GeneralizedToken CPTok]
x