{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PolymorphicComponents #-}
{-# LANGUAGE Safe #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module Text.Parsec.Token
( LanguageDef
, GenLanguageDef (..)
, TokenParser
, GenTokenParser (..)
, makeTokenParser
) where
import Data.Char ( isAlpha, toLower, toUpper, isSpace, digitToInt )
#if MIN_VERSION_base(4,7,0)
import Data.Typeable ( Typeable )
#endif
import Data.List ( nub, sort )
import Control.Monad.Identity
import Text.Parsec.Prim
import Text.Parsec.Char
import Text.Parsec.Combinator
type LanguageDef st = GenLanguageDef String st Identity
data GenLanguageDef s u m
= LanguageDef {
:: String,
:: String,
:: String,
:: Bool,
GenLanguageDef s u m -> ParsecT s u m Char
identStart :: ParsecT s u m Char,
GenLanguageDef s u m -> ParsecT s u m Char
identLetter :: ParsecT s u m Char,
GenLanguageDef s u m -> ParsecT s u m Char
opStart :: ParsecT s u m Char,
GenLanguageDef s u m -> ParsecT s u m Char
opLetter :: ParsecT s u m Char,
GenLanguageDef s u m -> [String]
reservedNames :: [String],
GenLanguageDef s u m -> [String]
reservedOpNames:: [String],
GenLanguageDef s u m -> Bool
caseSensitive :: Bool
}
#if MIN_VERSION_base(4,7,0)
deriving ( Typeable )
#endif
type TokenParser st = GenTokenParser String st Identity
data GenTokenParser s u m
= TokenParser {
GenTokenParser s u m -> ParsecT s u m String
identifier :: ParsecT s u m String,
GenTokenParser s u m -> String -> ParsecT s u m ()
reserved :: String -> ParsecT s u m (),
GenTokenParser s u m -> ParsecT s u m String
operator :: ParsecT s u m String,
GenTokenParser s u m -> String -> ParsecT s u m ()
reservedOp :: String -> ParsecT s u m (),
GenTokenParser s u m -> ParsecT s u m Char
charLiteral :: ParsecT s u m Char,
GenTokenParser s u m -> ParsecT s u m String
stringLiteral :: ParsecT s u m String,
GenTokenParser s u m -> ParsecT s u m Integer
natural :: ParsecT s u m Integer,
GenTokenParser s u m -> ParsecT s u m Integer
integer :: ParsecT s u m Integer,
GenTokenParser s u m -> ParsecT s u m Double
float :: ParsecT s u m Double,
GenTokenParser s u m -> ParsecT s u m (Either Integer Double)
naturalOrFloat :: ParsecT s u m (Either Integer Double),
GenTokenParser s u m -> ParsecT s u m Integer
decimal :: ParsecT s u m Integer,
GenTokenParser s u m -> ParsecT s u m Integer
hexadecimal :: ParsecT s u m Integer,
GenTokenParser s u m -> ParsecT s u m Integer
octal :: ParsecT s u m Integer,
GenTokenParser s u m -> String -> ParsecT s u m String
symbol :: String -> ParsecT s u m String,
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m a
lexeme :: forall a. ParsecT s u m a -> ParsecT s u m a,
GenTokenParser s u m -> ParsecT s u m ()
whiteSpace :: ParsecT s u m (),
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m a
parens :: forall a. ParsecT s u m a -> ParsecT s u m a,
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m a
braces :: forall a. ParsecT s u m a -> ParsecT s u m a,
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m a
angles :: forall a. ParsecT s u m a -> ParsecT s u m a,
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m a
brackets :: forall a. ParsecT s u m a -> ParsecT s u m a,
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m a
squares :: forall a. ParsecT s u m a -> ParsecT s u m a,
GenTokenParser s u m -> ParsecT s u m String
semi :: ParsecT s u m String,
GenTokenParser s u m -> ParsecT s u m String
comma :: ParsecT s u m String,
GenTokenParser s u m -> ParsecT s u m String
colon :: ParsecT s u m String,
GenTokenParser s u m -> ParsecT s u m String
dot :: ParsecT s u m String,
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m [a]
semiSep :: forall a . ParsecT s u m a -> ParsecT s u m [a],
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m [a]
semiSep1 :: forall a . ParsecT s u m a -> ParsecT s u m [a],
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m [a]
commaSep :: forall a . ParsecT s u m a -> ParsecT s u m [a],
GenTokenParser s u m
-> forall a. ParsecT s u m a -> ParsecT s u m [a]
commaSep1 :: forall a . ParsecT s u m a -> ParsecT s u m [a]
}
#if MIN_VERSION_base(4,7,0)
deriving ( Typeable )
#endif
makeTokenParser :: (Stream s m Char)
=> GenLanguageDef s u m -> GenTokenParser s u m
makeTokenParser :: GenLanguageDef s u m -> GenTokenParser s u m
makeTokenParser languageDef :: GenLanguageDef s u m
languageDef
= TokenParser :: forall s u (m :: * -> *).
ParsecT s u m String
-> (String -> ParsecT s u m ())
-> ParsecT s u m String
-> (String -> ParsecT s u m ())
-> ParsecT s u m Char
-> ParsecT s u m String
-> ParsecT s u m Integer
-> ParsecT s u m Integer
-> ParsecT s u m Double
-> ParsecT s u m (Either Integer Double)
-> ParsecT s u m Integer
-> ParsecT s u m Integer
-> ParsecT s u m Integer
-> (String -> ParsecT s u m String)
-> (forall a. ParsecT s u m a -> ParsecT s u m a)
-> ParsecT s u m ()
-> (forall a. ParsecT s u m a -> ParsecT s u m a)
-> (forall a. ParsecT s u m a -> ParsecT s u m a)
-> (forall a. ParsecT s u m a -> ParsecT s u m a)
-> (forall a. ParsecT s u m a -> ParsecT s u m a)
-> (forall a. ParsecT s u m a -> ParsecT s u m a)
-> ParsecT s u m String
-> ParsecT s u m String
-> ParsecT s u m String
-> ParsecT s u m String
-> (forall a. ParsecT s u m a -> ParsecT s u m [a])
-> (forall a. ParsecT s u m a -> ParsecT s u m [a])
-> (forall a. ParsecT s u m a -> ParsecT s u m [a])
-> (forall a. ParsecT s u m a -> ParsecT s u m [a])
-> GenTokenParser s u m
TokenParser{ identifier :: ParsecT s u m String
identifier = ParsecT s u m String
identifier
, reserved :: String -> ParsecT s u m ()
reserved = String -> ParsecT s u m ()
reserved
, operator :: ParsecT s u m String
operator = ParsecT s u m String
operator
, reservedOp :: String -> ParsecT s u m ()
reservedOp = String -> ParsecT s u m ()
reservedOp
, charLiteral :: ParsecT s u m Char
charLiteral = ParsecT s u m Char
forall u. ParsecT s u m Char
charLiteral
, stringLiteral :: ParsecT s u m String
stringLiteral = ParsecT s u m String
forall u. ParsecT s u m String
stringLiteral
, natural :: ParsecT s u m Integer
natural = ParsecT s u m Integer
forall u. ParsecT s u m Integer
natural
, integer :: ParsecT s u m Integer
integer = ParsecT s u m Integer
forall u. ParsecT s u m Integer
integer
, float :: ParsecT s u m Double
float = ParsecT s u m Double
forall u. ParsecT s u m Double
float
, naturalOrFloat :: ParsecT s u m (Either Integer Double)
naturalOrFloat = ParsecT s u m (Either Integer Double)
forall u. ParsecT s u m (Either Integer Double)
naturalOrFloat
, decimal :: ParsecT s u m Integer
decimal = ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal
, hexadecimal :: ParsecT s u m Integer
hexadecimal = ParsecT s u m Integer
forall u. ParsecT s u m Integer
hexadecimal
, octal :: ParsecT s u m Integer
octal = ParsecT s u m Integer
forall u. ParsecT s u m Integer
octal
, symbol :: String -> ParsecT s u m String
symbol = String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol
, lexeme :: forall a. ParsecT s u m a -> ParsecT s u m a
lexeme = forall a. ParsecT s u m a -> ParsecT s u m a
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme
, whiteSpace :: ParsecT s u m ()
whiteSpace = ParsecT s u m ()
forall u. ParsecT s u m ()
whiteSpace
, parens :: forall a. ParsecT s u m a -> ParsecT s u m a
parens = forall a. ParsecT s u m a -> ParsecT s u m a
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m a
parens
, braces :: forall a. ParsecT s u m a -> ParsecT s u m a
braces = forall a. ParsecT s u m a -> ParsecT s u m a
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m a
braces
, angles :: forall a. ParsecT s u m a -> ParsecT s u m a
angles = forall a. ParsecT s u m a -> ParsecT s u m a
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m a
angles
, brackets :: forall a. ParsecT s u m a -> ParsecT s u m a
brackets = forall a. ParsecT s u m a -> ParsecT s u m a
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m a
brackets
, squares :: forall a. ParsecT s u m a -> ParsecT s u m a
squares = forall a. ParsecT s u m a -> ParsecT s u m a
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m a
brackets
, semi :: ParsecT s u m String
semi = ParsecT s u m String
forall u. ParsecT s u m String
semi
, comma :: ParsecT s u m String
comma = ParsecT s u m String
forall u. ParsecT s u m String
comma
, colon :: ParsecT s u m String
colon = ParsecT s u m String
forall u. ParsecT s u m String
colon
, dot :: ParsecT s u m String
dot = ParsecT s u m String
forall u. ParsecT s u m String
dot
, semiSep :: forall a. ParsecT s u m a -> ParsecT s u m [a]
semiSep = forall a. ParsecT s u m a -> ParsecT s u m [a]
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m [a]
semiSep
, semiSep1 :: forall a. ParsecT s u m a -> ParsecT s u m [a]
semiSep1 = forall a. ParsecT s u m a -> ParsecT s u m [a]
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m [a]
semiSep1
, commaSep :: forall a. ParsecT s u m a -> ParsecT s u m [a]
commaSep = forall a. ParsecT s u m a -> ParsecT s u m [a]
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m [a]
commaSep
, commaSep1 :: forall a. ParsecT s u m a -> ParsecT s u m [a]
commaSep1 = forall a. ParsecT s u m a -> ParsecT s u m [a]
forall t u a. Stream s m t => ParsecT s u m a -> ParsecT s u m [a]
commaSep1
}
where
parens :: ParsecT s u m a -> ParsecT s u m a
parens p :: ParsecT s u m a
p = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "(") (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol ")") ParsecT s u m a
p
braces :: ParsecT s u m a -> ParsecT s u m a
braces p :: ParsecT s u m a
p = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "{") (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "}") ParsecT s u m a
p
angles :: ParsecT s u m a -> ParsecT s u m a
angles p :: ParsecT s u m a
p = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "<") (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol ">") ParsecT s u m a
p
brackets :: ParsecT s u m a -> ParsecT s u m a
brackets p :: ParsecT s u m a
p = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "[") (String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "]") ParsecT s u m a
p
semi :: ParsecT s u m String
semi = String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol ";"
comma :: ParsecT s u m String
comma = String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol ","
dot :: ParsecT s u m String
dot = String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol "."
colon :: ParsecT s u m String
colon = String -> ParsecT s u m String
forall u. String -> ParsecT s u m String
symbol ":"
commaSep :: ParsecT s u m a -> ParsecT s u m [a]
commaSep p :: ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy ParsecT s u m a
p ParsecT s u m String
forall u. ParsecT s u m String
comma
semiSep :: ParsecT s u m a -> ParsecT s u m [a]
semiSep p :: ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy ParsecT s u m a
p ParsecT s u m String
forall u. ParsecT s u m String
semi
commaSep1 :: ParsecT s u m a -> ParsecT s u m [a]
commaSep1 p :: ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy1 ParsecT s u m a
p ParsecT s u m String
forall u. ParsecT s u m String
comma
semiSep1 :: ParsecT s u m a -> ParsecT s u m [a]
semiSep1 p :: ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
sepBy1 ParsecT s u m a
p ParsecT s u m String
forall u. ParsecT s u m String
semi
charLiteral :: ParsecT s u m Char
charLiteral = ParsecT s u m Char -> ParsecT s u m Char
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (ParsecT s u m Char
-> ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\'')
(Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\'' ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "end of character")
ParsecT s u m Char
forall u. ParsecT s u m Char
characterChar )
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "character"
characterChar :: ParsecT s u m Char
characterChar = ParsecT s u m Char
forall u. ParsecT s u m Char
charLetter ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall u. ParsecT s u m Char
charEscape
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "literal character"
charEscape :: ParsecT s u m Char
charEscape = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\'; ParsecT s u m Char
forall u. ParsecT s u m Char
escapeCode }
charLetter :: ParsecT s u m Char
charLetter = (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\c :: Char
c -> (Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '\'') Bool -> Bool -> Bool
&& (Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '\\') Bool -> Bool -> Bool
&& (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
> '\026'))
stringLiteral :: ParsecT s u m String
stringLiteral = ParsecT s u m String -> ParsecT s u m String
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (
do{ [Maybe Char]
str <- ParsecT s u m Char
-> ParsecT s u m Char
-> ParsecT s u m [Maybe Char]
-> ParsecT s u m [Maybe Char]
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '"')
(Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '"' ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "end of string")
(ParsecT s u m (Maybe Char) -> ParsecT s u m [Maybe Char]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT s u m (Maybe Char)
forall u. ParsecT s u m (Maybe Char)
stringChar)
; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return ((Maybe Char -> String -> String)
-> String -> [Maybe Char] -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((String -> String)
-> (Char -> String -> String) -> Maybe Char -> String -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String -> String
forall a. a -> a
id (:)) "" [Maybe Char]
str)
}
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "literal string")
stringChar :: ParsecT s u m (Maybe Char)
stringChar = do{ Char
c <- ParsecT s u m Char
forall u. ParsecT s u m Char
stringLetter; Maybe Char -> ParsecT s u m (Maybe Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> Maybe Char
forall a. a -> Maybe a
Just Char
c) }
ParsecT s u m (Maybe Char)
-> ParsecT s u m (Maybe Char) -> ParsecT s u m (Maybe Char)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m (Maybe Char)
forall u. ParsecT s u m (Maybe Char)
stringEscape
ParsecT s u m (Maybe Char) -> String -> ParsecT s u m (Maybe Char)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "string character"
stringLetter :: ParsecT s u m Char
stringLetter = (Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (\c :: Char
c -> (Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '"') Bool -> Bool -> Bool
&& (Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '\\') Bool -> Bool -> Bool
&& (Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
> '\026'))
stringEscape :: ParsecT s u m (Maybe Char)
stringEscape = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\'
; do{ Char
_ <- ParsecT s u m Char
forall u. ParsecT s u m Char
escapeGap ; Maybe Char -> ParsecT s u m (Maybe Char)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Char
forall a. Maybe a
Nothing }
ParsecT s u m (Maybe Char)
-> ParsecT s u m (Maybe Char) -> ParsecT s u m (Maybe Char)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ Char
_ <- ParsecT s u m Char
forall u. ParsecT s u m Char
escapeEmpty; Maybe Char -> ParsecT s u m (Maybe Char)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Char
forall a. Maybe a
Nothing }
ParsecT s u m (Maybe Char)
-> ParsecT s u m (Maybe Char) -> ParsecT s u m (Maybe Char)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ Char
esc <- ParsecT s u m Char
forall u. ParsecT s u m Char
escapeCode; Maybe Char -> ParsecT s u m (Maybe Char)
forall (m :: * -> *) a. Monad m => a -> m a
return (Char -> Maybe Char
forall a. a -> Maybe a
Just Char
esc) }
}
escapeEmpty :: ParsecT s u m Char
escapeEmpty = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '&'
escapeGap :: ParsecT s u m Char
escapeGap = do{ String
_ <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
; Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\' ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "end of string gap"
}
escapeCode :: ParsecT s u m Char
escapeCode = ParsecT s u m Char
forall u. ParsecT s u m Char
charEsc ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall u. ParsecT s u m Char
charNum ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall u. ParsecT s u m Char
charAscii ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Char
forall u. ParsecT s u m Char
charControl
ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "escape code"
charControl :: ParsecT s u m Char
charControl = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '^'
; Char
code <- ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
upper
; Char -> ParsecT s u m Char
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Char
forall a. Enum a => Int -> a
toEnum (Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
code Int -> Int -> Int
forall a. Num a => a -> a -> a
- Char -> Int
forall a. Enum a => a -> Int
fromEnum 'A' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1))
}
charNum :: ParsecT s u m Char
charNum = do{ Integer
code <- ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal
ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char 'o'; Integer -> ParsecT s u m Char -> ParsecT s u m Integer
forall s (m :: * -> *) t u.
Stream s m t =>
Integer -> ParsecT s u m Char -> ParsecT s u m Integer
number 8 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
octDigit }
ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char 'x'; Integer -> ParsecT s u m Char -> ParsecT s u m Integer
forall s (m :: * -> *) t u.
Stream s m t =>
Integer -> ParsecT s u m Char -> ParsecT s u m Integer
number 16 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
hexDigit }
; if Integer
code Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> 0x10FFFF
then String -> ParsecT s u m Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "invalid escape sequence"
else Char -> ParsecT s u m Char
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Char
forall a. Enum a => Int -> a
toEnum (Integer -> Int
forall a. Num a => Integer -> a
fromInteger Integer
code))
}
charEsc :: ParsecT s u m Char
charEsc = [ParsecT s u m Char] -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice (((Char, Char) -> ParsecT s u m Char)
-> [(Char, Char)] -> [ParsecT s u m Char]
forall a b. (a -> b) -> [a] -> [b]
map (Char, Char) -> ParsecT s u m Char
forall s (m :: * -> *) b u.
Stream s m Char =>
(Char, b) -> ParsecT s u m b
parseEsc [(Char, Char)]
escMap)
where
parseEsc :: (Char, b) -> ParsecT s u m b
parseEsc (c :: Char
c,code :: b
code) = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c; b -> ParsecT s u m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
code }
charAscii :: ParsecT s u m Char
charAscii = [ParsecT s u m Char] -> ParsecT s u m Char
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice (((String, Char) -> ParsecT s u m Char)
-> [(String, Char)] -> [ParsecT s u m Char]
forall a b. (a -> b) -> [a] -> [b]
map (String, Char) -> ParsecT s u m Char
forall s (m :: * -> *) a u.
Stream s m Char =>
(String, a) -> ParsecT s u m a
parseAscii [(String, Char)]
asciiMap)
where
parseAscii :: (String, a) -> ParsecT s u m a
parseAscii (asc :: String
asc,code :: a
code) = ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (do{ String
_ <- String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
asc; a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
code })
escMap :: [(Char, Char)]
escMap = String -> String -> [(Char, Char)]
forall a b. [a] -> [b] -> [(a, b)]
zip ("abfnrtv\\\"\'") ("\a\b\f\n\r\t\v\\\"\'")
asciiMap :: [(String, Char)]
asciiMap = [String] -> String -> [(String, Char)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([String]
ascii3codes [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
ascii2codes) (String
ascii3 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ascii2)
ascii2codes :: [String]
ascii2codes = ["BS","HT","LF","VT","FF","CR","SO","SI","EM",
"FS","GS","RS","US","SP"]
ascii3codes :: [String]
ascii3codes = ["NUL","SOH","STX","ETX","EOT","ENQ","ACK","BEL",
"DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB",
"CAN","SUB","ESC","DEL"]
ascii2 :: String
ascii2 = ['\BS','\HT','\LF','\VT','\FF','\CR','\SO','\SI',
'\EM','\FS','\GS','\RS','\US','\SP']
ascii3 :: String
ascii3 = ['\NUL','\SOH','\STX','\ETX','\EOT','\ENQ','\ACK',
'\BEL','\DLE','\DC1','\DC2','\DC3','\DC4','\NAK',
'\SYN','\ETB','\CAN','\SUB','\ESC','\DEL']
naturalOrFloat :: ParsecT s u m (Either Integer Double)
naturalOrFloat = ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (ParsecT s u m (Either Integer Double)
forall u. ParsecT s u m (Either Integer Double)
natFloat) ParsecT s u m (Either Integer Double)
-> String -> ParsecT s u m (Either Integer Double)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "number"
float :: ParsecT s u m Double
float = ParsecT s u m Double -> ParsecT s u m Double
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme ParsecT s u m Double
forall u. ParsecT s u m Double
floating ParsecT s u m Double -> String -> ParsecT s u m Double
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "float"
integer :: ParsecT s u m Integer
integer = ParsecT s u m Integer -> ParsecT s u m Integer
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme ParsecT s u m Integer
forall u. ParsecT s u m Integer
int ParsecT s u m Integer -> String -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "integer"
natural :: ParsecT s u m Integer
natural = ParsecT s u m Integer -> ParsecT s u m Integer
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme ParsecT s u m Integer
forall u. ParsecT s u m Integer
nat ParsecT s u m Integer -> String -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "natural"
floating :: ParsecT s u m Double
floating = do{ Integer
n <- ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal
; Integer -> ParsecT s u m Double
forall a a u. (Read a, Show a) => a -> ParsecT s u m a
fractExponent Integer
n
}
natFloat :: ParsecT s u m (Either Integer Double)
natFloat = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '0'
; ParsecT s u m (Either Integer Double)
forall u. ParsecT s u m (Either Integer Double)
zeroNumFloat
}
ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m (Either Integer Double)
forall u. ParsecT s u m (Either Integer Double)
decimalFloat
zeroNumFloat :: ParsecT s u m (Either Integer Double)
zeroNumFloat = do{ Integer
n <- ParsecT s u m Integer
forall u. ParsecT s u m Integer
hexadecimal ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Integer
forall u. ParsecT s u m Integer
octal
; Either Integer Double -> ParsecT s u m (Either Integer Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Either Integer Double
forall a b. a -> Either a b
Left Integer
n)
}
ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m (Either Integer Double)
forall u. ParsecT s u m (Either Integer Double)
decimalFloat
ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Integer -> ParsecT s u m (Either Integer Double)
forall b a u a. (Read b, Show a) => a -> ParsecT s u m (Either a b)
fractFloat (0 :: Integer)
ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Either Integer Double -> ParsecT s u m (Either Integer Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Either Integer Double
forall a b. a -> Either a b
Left 0)
decimalFloat :: ParsecT s u m (Either Integer Double)
decimalFloat = do{ Integer
n <- ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal
; Either Integer Double
-> ParsecT s u m (Either Integer Double)
-> ParsecT s u m (Either Integer Double)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option (Integer -> Either Integer Double
forall a b. a -> Either a b
Left Integer
n)
(Integer -> ParsecT s u m (Either Integer Double)
forall b a u a. (Read b, Show a) => a -> ParsecT s u m (Either a b)
fractFloat Integer
n)
}
fractFloat :: a -> ParsecT s u m (Either a b)
fractFloat n :: a
n = do{ b
f <- a -> ParsecT s u m b
forall a a u. (Read a, Show a) => a -> ParsecT s u m a
fractExponent a
n
; Either a b -> ParsecT s u m (Either a b)
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> Either a b
forall a b. b -> Either a b
Right b
f)
}
fractExponent :: a -> ParsecT s u m a
fractExponent n :: a
n = do{ String
fract <- ParsecT s u m String
forall u. ParsecT s u m String
fraction
; String
expo <- String -> ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option "" ParsecT s u m String
forall u. ParsecT s u m String
exponent'
; String -> ParsecT s u m a
forall a s u (m :: * -> *). Read a => String -> ParsecT s u m a
readDouble (a -> String
forall a. Show a => a -> String
show a
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
fract String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
expo)
}
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
do{ String
expo <- ParsecT s u m String
forall u. ParsecT s u m String
exponent'
; String -> ParsecT s u m a
forall a s u (m :: * -> *). Read a => String -> ParsecT s u m a
readDouble (a -> String
forall a. Show a => a -> String
show a
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
expo)
}
where
readDouble :: String -> ParsecT s u m a
readDouble s :: String
s =
case ReadS a
forall a. Read a => ReadS a
reads String
s of
[(x :: a
x, "")] -> a -> ParsecT s u m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
_ -> ParsecT s u m a
forall s u (m :: * -> *) a. ParsecT s u m a
parserZero
fraction :: ParsecT s u m String
fraction = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '.'
; String
digits <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "fraction"
; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return ('.' Char -> String -> String
forall a. a -> [a] -> [a]
: String
digits)
}
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "fraction"
exponent' :: ParsecT s u m String
exponent' = do{ Char
_ <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "eE"
; String
sign' <- (Char -> String) -> ParsecT s u m Char -> ParsecT s u m String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Char -> String -> String
forall a. a -> [a] -> [a]
:[]) (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "+-") ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return ""
; Integer
e <- ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal ParsecT s u m Integer -> String -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "exponent"
; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return ('e' Char -> String -> String
forall a. a -> [a] -> [a]
: String
sign' String -> String -> String
forall a. [a] -> [a] -> [a]
++ Integer -> String
forall a. Show a => a -> String
show Integer
e)
}
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "exponent"
int :: ParsecT s u m Integer
int = do{ Integer -> Integer
f <- ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme ParsecT s u m (Integer -> Integer)
forall u. ParsecT s u m (Integer -> Integer)
sign
; Integer
n <- ParsecT s u m Integer
forall u. ParsecT s u m Integer
nat
; Integer -> ParsecT s u m Integer
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Integer
f Integer
n)
}
sign :: ParsecT s u m (Integer -> Integer)
sign = (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '-' ParsecT s u m Char
-> ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (Integer -> Integer) -> ParsecT s u m (Integer -> Integer)
forall (m :: * -> *) a. Monad m => a -> m a
return Integer -> Integer
forall a. Num a => a -> a
negate)
ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '+' ParsecT s u m Char
-> ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (Integer -> Integer) -> ParsecT s u m (Integer -> Integer)
forall (m :: * -> *) a. Monad m => a -> m a
return Integer -> Integer
forall a. a -> a
id)
ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
-> ParsecT s u m (Integer -> Integer)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Integer -> Integer) -> ParsecT s u m (Integer -> Integer)
forall (m :: * -> *) a. Monad m => a -> m a
return Integer -> Integer
forall a. a -> a
id
nat :: ParsecT s u m Integer
nat = ParsecT s u m Integer
forall u. ParsecT s u m Integer
zeroNumber ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal
zeroNumber :: ParsecT s u m Integer
zeroNumber = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '0'
; ParsecT s u m Integer
forall u. ParsecT s u m Integer
hexadecimal ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Integer
forall u. ParsecT s u m Integer
octal ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m Integer
forall u. ParsecT s u m Integer
decimal ParsecT s u m Integer
-> ParsecT s u m Integer -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Integer -> ParsecT s u m Integer
forall (m :: * -> *) a. Monad m => a -> m a
return 0
}
ParsecT s u m Integer -> String -> ParsecT s u m Integer
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> ""
decimal :: ParsecT s u m Integer
decimal = Integer -> ParsecT s u m Char -> ParsecT s u m Integer
forall s (m :: * -> *) t u.
Stream s m t =>
Integer -> ParsecT s u m Char -> ParsecT s u m Integer
number 10 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
hexadecimal :: ParsecT s u m Integer
hexadecimal = do{ Char
_ <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "xX"; Integer -> ParsecT s u m Char -> ParsecT s u m Integer
forall s (m :: * -> *) t u.
Stream s m t =>
Integer -> ParsecT s u m Char -> ParsecT s u m Integer
number 16 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
hexDigit }
octal :: ParsecT s u m Integer
octal = do{ Char
_ <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf "oO"; Integer -> ParsecT s u m Char -> ParsecT s u m Integer
forall s (m :: * -> *) t u.
Stream s m t =>
Integer -> ParsecT s u m Char -> ParsecT s u m Integer
number 8 ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
octDigit }
number :: Integer -> ParsecT s u m Char -> ParsecT s u m Integer
number base :: Integer
base baseDigit :: ParsecT s u m Char
baseDigit
= do{ String
digits <- ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 ParsecT s u m Char
baseDigit
; let n :: Integer
n = (Integer -> Char -> Integer) -> Integer -> String -> Integer
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (\x :: Integer
x d :: Char
d -> Integer
baseInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
x Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Char -> Int
digitToInt Char
d)) 0 String
digits
; Integer -> ParsecT s u m Integer -> ParsecT s u m Integer
forall a b. a -> b -> b
seq Integer
n (Integer -> ParsecT s u m Integer
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
n)
}
reservedOp :: String -> ParsecT s u m ()
reservedOp name :: String
name =
ParsecT s u m () -> ParsecT s u m ()
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$
do{ String
_ <- String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
name
; ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (GenLanguageDef s u m -> ParsecT s u m Char
forall s u (m :: * -> *).
GenLanguageDef s u m -> ParsecT s u m Char
opLetter GenLanguageDef s u m
languageDef) ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> ("end of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
name)
}
operator :: ParsecT s u m String
operator =
ParsecT s u m String -> ParsecT s u m String
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$
do{ String
name <- ParsecT s u m String
oper
; if (String -> Bool
isReservedOp String
name)
then String -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
String -> ParsecT s u m a
unexpected ("reserved operator " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
name)
else String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
name
}
oper :: ParsecT s u m String
oper =
do{ Char
c <- (GenLanguageDef s u m -> ParsecT s u m Char
forall s u (m :: * -> *).
GenLanguageDef s u m -> ParsecT s u m Char
opStart GenLanguageDef s u m
languageDef)
; String
cs <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (GenLanguageDef s u m -> ParsecT s u m Char
forall s u (m :: * -> *).
GenLanguageDef s u m -> ParsecT s u m Char
opLetter GenLanguageDef s u m
languageDef)
; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:String
cs)
}
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "operator"
isReservedOp :: String -> Bool
isReservedOp name :: String
name =
[String] -> String -> Bool
forall a. Ord a => [a] -> a -> Bool
isReserved ([String] -> [String]
forall a. Ord a => [a] -> [a]
sort (GenLanguageDef s u m -> [String]
forall s u (m :: * -> *). GenLanguageDef s u m -> [String]
reservedOpNames GenLanguageDef s u m
languageDef)) String
name
reserved :: String -> ParsecT s u m ()
reserved name :: String
name =
ParsecT s u m () -> ParsecT s u m ()
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$ ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m () -> ParsecT s u m ())
-> ParsecT s u m () -> ParsecT s u m ()
forall a b. (a -> b) -> a -> b
$
do{ String
_ <- String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
caseString String
name
; ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy (GenLanguageDef s u m -> ParsecT s u m Char
forall s u (m :: * -> *).
GenLanguageDef s u m -> ParsecT s u m Char
identLetter GenLanguageDef s u m
languageDef) ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> ("end of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
name)
}
caseString :: String -> ParsecT s u m String
caseString name :: String
name
| GenLanguageDef s u m -> Bool
forall s u (m :: * -> *). GenLanguageDef s u m -> Bool
caseSensitive GenLanguageDef s u m
languageDef = String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
name
| Bool
otherwise = do{ String -> ParsecT s u m ()
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m ()
walk String
name; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
name }
where
walk :: String -> ParsecT s u m ()
walk [] = () -> ParsecT s u m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
walk (c :: Char
c:cs :: String
cs) = do{ Char
_ <- Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
caseChar Char
c ParsecT s u m Char -> String -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
msg; String -> ParsecT s u m ()
walk String
cs }
caseChar :: Char -> ParsecT s u m Char
caseChar c :: Char
c | Char -> Bool
isAlpha Char
c = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char (Char -> Char
toLower Char
c) ParsecT s u m Char -> ParsecT s u m Char -> ParsecT s u m Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char (Char -> Char
toUpper Char
c)
| Bool
otherwise = Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
c
msg :: String
msg = String -> String
forall a. Show a => a -> String
show String
name
identifier :: ParsecT s u m String
identifier =
ParsecT s u m String -> ParsecT s u m String
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$ ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT s u m String -> ParsecT s u m String)
-> ParsecT s u m String -> ParsecT s u m String
forall a b. (a -> b) -> a -> b
$
do{ String
name <- ParsecT s u m String
ident
; if (String -> Bool
isReservedName String
name)
then String -> ParsecT s u m String
forall s (m :: * -> *) t u a.
Stream s m t =>
String -> ParsecT s u m a
unexpected ("reserved word " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
name)
else String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return String
name
}
ident :: ParsecT s u m String
ident
= do{ Char
c <- GenLanguageDef s u m -> ParsecT s u m Char
forall s u (m :: * -> *).
GenLanguageDef s u m -> ParsecT s u m Char
identStart GenLanguageDef s u m
languageDef
; String
cs <- ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (GenLanguageDef s u m -> ParsecT s u m Char
forall s u (m :: * -> *).
GenLanguageDef s u m -> ParsecT s u m Char
identLetter GenLanguageDef s u m
languageDef)
; String -> ParsecT s u m String
forall (m :: * -> *) a. Monad m => a -> m a
return (Char
cChar -> String -> String
forall a. a -> [a] -> [a]
:String
cs)
}
ParsecT s u m String -> String -> ParsecT s u m String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "identifier"
isReservedName :: String -> Bool
isReservedName name :: String
name
= [String] -> String -> Bool
forall a. Ord a => [a] -> a -> Bool
isReserved [String]
theReservedNames String
caseName
where
caseName :: String
caseName | GenLanguageDef s u m -> Bool
forall s u (m :: * -> *). GenLanguageDef s u m -> Bool
caseSensitive GenLanguageDef s u m
languageDef = String
name
| Bool
otherwise = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
name
isReserved :: [a] -> a -> Bool
isReserved names :: [a]
names name :: a
name
= [a] -> Bool
scan [a]
names
where
scan :: [a] -> Bool
scan [] = Bool
False
scan (r :: a
r:rs :: [a]
rs) = case (a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
r a
name) of
LT -> [a] -> Bool
scan [a]
rs
EQ -> Bool
True
GT -> Bool
False
theReservedNames :: [String]
theReservedNames
| GenLanguageDef s u m -> Bool
forall s u (m :: * -> *). GenLanguageDef s u m -> Bool
caseSensitive GenLanguageDef s u m
languageDef = [String] -> [String]
forall a. Ord a => [a] -> [a]
sort [String]
reserved
| Bool
otherwise = [String] -> [String]
forall a. Ord a => [a] -> [a]
sort ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ((Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
reserved
where
reserved :: [String]
reserved = GenLanguageDef s u m -> [String]
forall s u (m :: * -> *). GenLanguageDef s u m -> [String]
reservedNames GenLanguageDef s u m
languageDef
symbol :: String -> ParsecT s u m String
symbol name :: String
name
= ParsecT s u m String -> ParsecT s u m String
forall u b. ParsecT s u m b -> ParsecT s u m b
lexeme (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
name)
lexeme :: ParsecT s u m b -> ParsecT s u m b
lexeme p :: ParsecT s u m b
p
= do{ b
x <- ParsecT s u m b
p; ParsecT s u m ()
forall u. ParsecT s u m ()
whiteSpace; b -> ParsecT s u m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
x }
whiteSpace :: ParsecT s u m ()
whiteSpace
| Bool
noLine Bool -> Bool -> Bool
&& Bool
noMulti = ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (ParsecT s u m ()
forall u. ParsecT s u m ()
simpleSpace ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "")
| Bool
noLine = ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (ParsecT s u m ()
forall u. ParsecT s u m ()
simpleSpace ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m ()
forall u. ParsecT s u m ()
multiLineComment ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "")
| Bool
noMulti = ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (ParsecT s u m ()
forall u. ParsecT s u m ()
simpleSpace ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m ()
forall u. ParsecT s u m ()
oneLineComment ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "")
| Bool
otherwise = ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (ParsecT s u m ()
forall u. ParsecT s u m ()
simpleSpace ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m ()
forall u. ParsecT s u m ()
oneLineComment ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT s u m ()
forall u. ParsecT s u m ()
multiLineComment ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "")
where
noLine :: Bool
noLine = String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentLine GenLanguageDef s u m
languageDef)
noMulti :: Bool
noMulti = String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentStart GenLanguageDef s u m
languageDef)
simpleSpace :: ParsecT s u m ()
simpleSpace =
ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
skipMany1 ((Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isSpace)
oneLineComment :: ParsecT s u m ()
oneLineComment =
do{ String
_ <- ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentLine GenLanguageDef s u m
languageDef))
; ParsecT s u m Char -> ParsecT s u m ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ((Char -> Bool) -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '\n'))
; () -> ParsecT s u m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
}
multiLineComment :: ParsecT s u m ()
multiLineComment =
do { String
_ <- ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentStart GenLanguageDef s u m
languageDef))
; ParsecT s u m ()
inComment
}
inComment :: ParsecT s u m ()
inComment
| GenLanguageDef s u m -> Bool
forall s u (m :: * -> *). GenLanguageDef s u m -> Bool
nestedComments GenLanguageDef s u m
languageDef = ParsecT s u m ()
inCommentMulti
| Bool
otherwise = ParsecT s u m ()
forall u. ParsecT s u m ()
inCommentSingle
inCommentMulti :: ParsecT s u m ()
inCommentMulti
= do{ String
_ <- ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentEnd GenLanguageDef s u m
languageDef)) ; () -> ParsecT s u m ()
forall (m :: * -> *) a. Monad m => a -> m a
return () }
ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ ParsecT s u m ()
multiLineComment ; ParsecT s u m ()
inCommentMulti }
ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
skipMany1 (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
startEnd) ; ParsecT s u m ()
inCommentMulti }
ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ Char
_ <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
startEnd ; ParsecT s u m ()
inCommentMulti }
ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "end of comment"
where
startEnd :: String
startEnd = String -> String
forall a. Eq a => [a] -> [a]
nub (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentEnd GenLanguageDef s u m
languageDef String -> String -> String
forall a. [a] -> [a] -> [a]
++ GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentStart GenLanguageDef s u m
languageDef)
inCommentSingle :: ParsecT s u m ()
inCommentSingle
= do{ String
_ <- ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentEnd GenLanguageDef s u m
languageDef)); () -> ParsecT s u m ()
forall (m :: * -> *) a. Monad m => a -> m a
return () }
ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ ParsecT s u m Char -> ParsecT s u m ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
skipMany1 (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
startEnd) ; ParsecT s u m ()
inCommentSingle }
ParsecT s u m () -> ParsecT s u m () -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> do{ Char
_ <- String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
startEnd ; ParsecT s u m ()
inCommentSingle }
ParsecT s u m () -> String -> ParsecT s u m ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "end of comment"
where
startEnd :: String
startEnd = String -> String
forall a. Eq a => [a] -> [a]
nub (GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentEnd GenLanguageDef s u m
languageDef String -> String -> String
forall a. [a] -> [a] -> [a]
++ GenLanguageDef s u m -> String
forall s u (m :: * -> *). GenLanguageDef s u m -> String
commentStart GenLanguageDef s u m
languageDef)