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


-- Identifiers and Symbols -----------------------------------------------------

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)


-- Types -----------------------------------------------------------------------

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>"


-- Utilities -------------------------------------------------------------------

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