module Text.LLVM.Parser where
import Text.LLVM.AST
import Data.Char (chr)
import Data.Word (Word32, Word64)
import Text.Parsec
import Text.Parsec.String
pNameChar :: Parser Char
pNameChar :: Parser Char
pNameChar = Parser Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter Parser Char -> Parser Char -> Parser Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit Parser Char -> Parser Char -> Parser Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> String -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"-$._"
pHexEscape :: Parser Char
pHexEscape :: Parser Char
pHexEscape =
do Char
_ <- Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'\\'
Char
a <- Parser Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
hexDigit
Char
b <- Parser Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
hexDigit
Char -> Parser Char
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Char
chr (String -> Int
forall a. Read a => String -> a
read (String
"0x" String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
a, Char
b])))
pStringChar :: Parser Char
pStringChar :: Parser Char
pStringChar = String -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"\"\\" Parser Char -> Parser Char -> Parser Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Char
pHexEscape
pName :: Parser String
pName :: Parser String
pName = Parser Char -> Parser String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 Parser Char
pNameChar Parser String -> Parser String -> Parser String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser String -> Parser String
forall a. Parser a -> Parser a
quotes (Parser Char -> Parser String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 Parser Char
pStringChar)
pIdent :: Parser Ident
pIdent :: Parser Ident
pIdent = String -> Ident
Ident (String -> Ident) -> Parser String -> Parser Ident
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'%' Parser Char -> Parser String -> Parser String
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser String
pName)
pSymbol :: Parser Symbol
pSymbol :: Parser Symbol
pSymbol = String -> Symbol
Symbol (String -> Symbol) -> Parser String -> Parser Symbol
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'@' Parser Char -> Parser String -> Parser String
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser String
pName)
pWord32 :: Parser Word32
pWord32 :: Parser Word32
pWord32 = String -> Word32
forall a. Read a => String -> a
read (String -> Word32) -> Parser String -> Parser Word32
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Char -> Parser String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 Parser Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
pWord64 :: Parser Word64
pWord64 :: Parser Word64
pWord64 = String -> Word64
forall a. Read a => String -> a
read (String -> Word64) -> Parser String -> Parser Word64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Char -> Parser String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 Parser Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
pPrimType :: Parser PrimType
pPrimType :: Parser PrimType
pPrimType = [Parser PrimType] -> Parser PrimType
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice
[ Word32 -> PrimType
Integer (Word32 -> PrimType) -> Parser Word32 -> Parser PrimType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Word32 -> Parser Word32
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'i' Parser Char -> Parser Word32 -> Parser Word32
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser Word32
pWord32)
, FloatType -> PrimType
FloatType (FloatType -> PrimType)
-> ParsecT String () Identity FloatType -> Parser PrimType
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () Identity FloatType
pFloatType
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"label") Parser String -> Parser PrimType -> Parser PrimType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PrimType -> Parser PrimType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return PrimType
Label
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"void") Parser String -> Parser PrimType -> Parser PrimType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PrimType -> Parser PrimType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return PrimType
Void
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"x86mmx") Parser String -> Parser PrimType -> Parser PrimType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PrimType -> Parser PrimType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return PrimType
X86mmx
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"metadata") Parser String -> Parser PrimType -> Parser PrimType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> PrimType -> Parser PrimType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return PrimType
Metadata
]
pFloatType :: Parser FloatType
pFloatType :: ParsecT String () Identity FloatType
pFloatType = [ParsecT String () Identity FloatType]
-> ParsecT String () Identity FloatType
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice
[ Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"half") Parser String
-> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FloatType -> ParsecT String () Identity FloatType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return FloatType
Half
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"float") Parser String
-> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FloatType -> ParsecT String () Identity FloatType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return FloatType
Float
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"double") Parser String
-> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FloatType -> ParsecT String () Identity FloatType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return FloatType
Double
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"fp128") Parser String
-> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FloatType -> ParsecT String () Identity FloatType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return FloatType
Fp128
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"x86_fp80") Parser String
-> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FloatType -> ParsecT String () Identity FloatType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return FloatType
X86_fp80
, Parser String -> Parser String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"ppc_fp128") Parser String
-> ParsecT String () Identity FloatType
-> ParsecT String () Identity FloatType
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> FloatType -> ParsecT String () Identity FloatType
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return FloatType
PPC_fp128
]
pType :: Parser Type
pType :: Parser Type
pType = Parser Type
pType0 Parser Type -> (Type -> Parser Type) -> Parser Type
forall a b.
ParsecT String () Identity a
-> (a -> ParsecT String () Identity b)
-> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Type -> Parser Type
pFunPtr
where
pType0 :: Parser Type
pType0 :: Parser Type
pType0 =
[Parser Type] -> Parser Type
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice
[ Ident -> Type
forall ident. ident -> Type' ident
Alias (Ident -> Type) -> Parser Ident -> Parser Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Ident
pIdent
, Parser Type -> Parser Type
forall a. Parser a -> Parser a
brackets ((Word64 -> Type -> Type) -> Parser Type
pNumType Word64 -> Type -> Type
forall ident. Word64 -> Type' ident -> Type' ident
Array)
, Parser Type -> Parser Type
forall a. Parser a -> Parser a
braces ([Type] -> Type
forall ident. [Type' ident] -> Type' ident
Struct ([Type] -> Type)
-> ParsecT String () Identity [Type] -> Parser Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () Identity [Type]
pTypeList)
, Parser Type -> Parser Type
forall a. Parser a -> Parser a
angles (Parser Type -> Parser Type
forall a. Parser a -> Parser a
braces ([Type] -> Type
forall ident. [Type' ident] -> Type' ident
PackedStruct ([Type] -> Type)
-> ParsecT String () Identity [Type] -> Parser Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () Identity [Type]
pTypeList) Parser Type -> Parser Type -> Parser Type
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Type -> Parser Type
forall a. Parser a -> Parser a
spaced ((Word64 -> Type -> Type) -> Parser Type
pNumType Word64 -> Type -> Type
forall ident. Word64 -> Type' ident -> Type' ident
Vector))
, String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"opaque" Parser String -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Type
forall ident. Type' ident
Opaque
, PrimType -> Type
forall ident. PrimType -> Type' ident
PrimType (PrimType -> Type) -> Parser PrimType -> Parser Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser PrimType
pPrimType
, String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"ptr" Parser String -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Type
forall ident. Type' ident
PtrOpaque
]
pTypeList :: Parser [Type]
pTypeList :: ParsecT String () Identity [Type]
pTypeList = Parser Type -> Parser Char -> ParsecT String () Identity [Type]
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 (Parser Type -> Parser Type
forall a. Parser a -> Parser a
spaced Parser Type
pType) (Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',')
pNumType :: (Word64 -> Type -> Type) -> Parser Type
pNumType :: (Word64 -> Type -> Type) -> Parser Type
pNumType Word64 -> Type -> Type
f =
do Word64
n <- Parser Word64
pWord64
ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () Identity () -> Parser Char -> Parser Char
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'x' Parser Char
-> ParsecT String () Identity () -> ParsecT String () Identity ()
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
Type
t <- Parser Type
pType
Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Word64 -> Type -> Type
f Word64
n Type
t)
pArgList :: Type -> Parser Type
pArgList :: Type -> Parser Type
pArgList Type
t0 = ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () Identity () -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([Type] -> Parser Type
p1 [] Parser Type -> Parser Type -> Parser Type
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Type -> [Type] -> Bool -> Type
forall ident. Type' ident -> [Type' ident] -> Bool -> Type' ident
FunTy Type
t0 [] Bool
False))
where
p1 :: [Type] -> Parser Type
p1 [Type]
ts =
(String -> Parser String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"..." Parser String
-> ParsecT String () Identity () -> ParsecT String () Identity ()
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () Identity () -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Type -> [Type] -> Bool -> Type
forall ident. Type' ident -> [Type' ident] -> Bool -> Type' ident
FunTy Type
t0 ([Type] -> [Type]
forall a. [a] -> [a]
reverse [Type]
ts) Bool
True))
Parser Type -> Parser Type -> Parser Type
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Parser Type
pType Parser Type -> (Type -> Parser Type) -> Parser Type
forall a b.
ParsecT String () Identity a
-> (a -> ParsecT String () Identity b)
-> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Type
t -> (ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () Identity () -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Type] -> Parser Type
p2 (Type
t Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: [Type]
ts)))
p2 :: [Type] -> Parser Type
p2 [Type]
ts =
(Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
',' Parser Char
-> ParsecT String () Identity () -> ParsecT String () Identity ()
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () Identity () -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Type] -> Parser Type
p1 [Type]
ts)
Parser Type -> Parser Type -> Parser Type
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Type -> [Type] -> Bool -> Type
forall ident. Type' ident -> [Type' ident] -> Bool -> Type' ident
FunTy Type
t0 ([Type] -> [Type]
forall a. [a] -> [a]
reverse [Type]
ts) Bool
False)
pFunPtr :: Type -> Parser Type
pFunPtr :: Type -> Parser Type
pFunPtr Type
t0 = Parser Type
pFun Parser Type -> Parser Type -> Parser Type
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Type
pPtr Parser Type -> Parser Type -> Parser Type
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Type -> Parser Type
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Type
t0
where
pFun :: Parser Type
pFun = Parser Type -> Parser Type
forall a. Parser a -> Parser a
parens (Type -> Parser Type
pArgList Type
t0) Parser Type -> (Type -> Parser Type) -> Parser Type
forall a b.
ParsecT String () Identity a
-> (a -> ParsecT String () Identity b)
-> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Type -> Parser Type
pFunPtr
pPtr :: Parser Type
pPtr = Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'*' Parser Char -> Parser Type -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Type -> Parser Type
pFunPtr (Type -> Type
forall ident. Type' ident -> Type' ident
PtrTo Type
t0)
parseType :: String -> Either ParseError Type
parseType :: String -> Either ParseError Type
parseType = Parser Type -> String -> String -> Either ParseError Type
forall s t a.
Stream s Identity t =>
Parsec s () a -> String -> s -> Either ParseError a
parse (Parser Type
pType Parser Type -> ParsecT String () Identity () -> Parser Type
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String () Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof) String
"<internal>"
angles :: Parser a -> Parser a
angles :: forall a. Parser a -> Parser a
angles Parser a
body = Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'<' Parser Char -> Parser a -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
body Parser a -> Parser Char -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'>'
braces :: Parser a -> Parser a
braces :: forall a. Parser a -> Parser a
braces Parser a
body = Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'{' Parser Char -> Parser a -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
body Parser a -> Parser Char -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}'
brackets :: Parser a -> Parser a
brackets :: forall a. Parser a -> Parser a
brackets Parser a
body = Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'[' Parser Char -> Parser a -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
body Parser a -> Parser Char -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
']'
parens :: Parser a -> Parser a
parens :: forall a. Parser a -> Parser a
parens Parser a
body = Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'(' Parser Char -> Parser a -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
body Parser a -> Parser Char -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
quotes :: Parser a -> Parser a
quotes :: forall a. Parser a -> Parser a
quotes Parser a
body = Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"' Parser Char -> Parser a -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
body Parser a -> Parser Char -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"'
spaced :: Parser a -> Parser a
spaced :: forall a. Parser a -> Parser a
spaced Parser a
body = ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () Identity () -> Parser a -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
body Parser a -> ParsecT String () Identity () -> Parser a
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces