{-# LANGUAGE TemplateHaskell, TypeOperators #-}
module ABI.Itanium (
  DecodedName(..),
  CVQualifier(..),
  CXXType(..),
  Name(..),
  Prefix(..),
  UnqualifiedName(..),
  CtorDtor(..),
  Operator(..),
  Expression(..),
  CallOffset(..),
  Substitution(..),
  UName(..),
  demangleName,
  mangleName,
  cxxNameToString,
  cxxNameToText,
  -- * Generated parsers
  rUnqualifiedPrefix,
  rConst,
  rSourceName,
  rUName,
  rNestedName,
  rUnscopedName
  ) where

import Prelude hiding ( (.) )
import Control.Category ( (.) )
import Data.Char
import Text.Boomerang
import Text.Boomerang.String
import Text.Boomerang.TH

import ABI.Itanium.Pretty
import ABI.Itanium.Types

$(makeBoomerangs ''DecodedName)
$(makeBoomerangs ''Name)
$(makeBoomerangs ''CVQualifier)
$(makeBoomerangs ''CXXType)
$(makeBoomerangs ''Operator)
$(makeBoomerangs ''CtorDtor)
$(makeBoomerangs ''UnqualifiedName)
$(makeBoomerangs ''Prefix)
$(makeBoomerangs ''CallOffset)
$(makeBoomerangs ''Substitution)
$(makeBoomerangs ''UName)
$(makeBoomerangs ''TemplateArg)
$(makeBoomerangs ''TemplateParam)
$(makeBoomerangs ''ExprPrimary)

-- | Demangle a name into a structured representation (or an error
-- string)
demangleName :: String -> Either String DecodedName
demangleName :: String -> Either String DecodedName
demangleName String
s =
  case forall r.
StringBoomerang () (r :- ()) -> String -> Either StringError r
parseString StringBoomerang () (DecodedName :- ())
itaniumName String
s of
    Right DecodedName
n -> forall a b. b -> Either a b
Right DecodedName
n
    Left StringError
e -> forall a b. a -> Either a b
Left (forall a. Show a => a -> String
show StringError
e)

-- | Re-mangle a name
mangleName :: DecodedName -> Maybe String
mangleName :: DecodedName -> Maybe String
mangleName = forall r. StringBoomerang () (r :- ()) -> r -> Maybe String
unparseString StringBoomerang () (DecodedName :- ())
itaniumName

itaniumName :: StringBoomerang () (DecodedName :- ())
itaniumName :: StringBoomerang () (DecodedName :- ())
itaniumName = forall r. String -> StringBoomerang r r
lit String
"_Z" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (DecodedName :- a)
topLevelEntity

topLevelEntity :: Boomerang StringError String a (DecodedName :- a)
topLevelEntity :: forall a. Boomerang StringError String a (DecodedName :- a)
topLevelEntity =
  ( forall tok e r. Boomerang e tok (CXXType :- r) (DecodedName :- r)
rVirtualTable forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"TV" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
    forall tok e r. Boomerang e tok (CXXType :- r) (DecodedName :- r)
rVTTStructure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"TT" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
    forall tok e r. Boomerang e tok (CXXType :- r) (DecodedName :- r)
rTypeInfo forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"TI" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
    forall tok e r. Boomerang e tok (CXXType :- r) (DecodedName :- r)
rTypeInfoName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"TS" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
    forall tok e r. Boomerang e tok (Name :- r) (DecodedName :- r)
rGuardVariable forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"GV" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Name :- a)
name forall a. Semigroup a => a -> a -> a
<>
    forall tok e r.
Boomerang
  e tok (CallOffset :- (DecodedName :- r)) (DecodedName :- r)
rOverrideThunk forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"T" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CallOffset :- a)
callOffset forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (DecodedName :- a)
topLevelEntity forall a. Semigroup a => a -> a -> a
<>
    forall tok e r.
Boomerang
  e
  tok
  (CallOffset :- (CallOffset :- (DecodedName :- r)))
  (DecodedName :- r)
rOverrideThunkCovariant forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Tc" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CallOffset :- a)
callOffset forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CallOffset :- a)
callOffset forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (DecodedName :- a)
topLevelEntity forall a. Semigroup a => a -> a -> a
<>
    forall tok e r.
Boomerang e tok (UnqualifiedName :- r) (DecodedName :- r)
rConstStructData forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"L" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName forall a. Semigroup a => a -> a -> a
<>

    -- The following is a "static" function definition, but c++filt
    -- doesn't reproduce the "static" part.
    forall tok e r.
Boomerang e tok (Name :- ([CXXType] :- r)) (DecodedName :- r)
rFunction forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"L" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Name :- a)
name forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([CXXType] :- a)
bareFunctionType forall a. Semigroup a => a -> a -> a
<>

    forall tok e r.
Boomerang e tok (Name :- ([CXXType] :- r)) (DecodedName :- r)
rFunction forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Name :- a)
name forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([CXXType] :- a)
bareFunctionType forall a. Semigroup a => a -> a -> a
<>
    forall tok e r. Boomerang e tok (Name :- r) (DecodedName :- r)
rData forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Name :- a)
name
  )


-- | Equivalent to the <type> production in the Itanium ABI spec
--
-- FIXME: Add support for unnamed types and decltypes
--
-- <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
-- <decltype>  ::= Dt <expression> E  # decltype of an id-expression or class member access (C++0x)
--             ::= DT <expression> E  # decltype of an expression (C++0x)
cxxType :: Boomerang StringError String a (CXXType :- a)
cxxType :: forall a. Boomerang StringError String a (CXXType :- a)
cxxType = ( forall tok e r.
Boomerang e tok ([CVQualifier] :- (CXXType :- r)) (CXXType :- r)
rQualifiedType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList1 forall a. Boomerang StringError String a (CVQualifier :- a)
cvQualifier forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (CXXType :- r) (CXXType :- r)
rPointerToType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"P" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (CXXType :- r) (CXXType :- r)
rReferenceToType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"R" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (CXXType :- r) (CXXType :- r)
rRValueReferenceToType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"O" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (CXXType :- r) (CXXType :- r)
rComplexPairType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"C" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<> -- C99
            forall tok e r. Boomerang e tok (CXXType :- r) (CXXType :- r)
rImaginaryType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"G" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<> -- C99
            forall tok e r. Boomerang e tok (CXXType :- r) (CXXType :- r)
rParameterPack forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Dp" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType  forall a. Semigroup a => a -> a -> a
<> -- C++11 parameter pack
            forall tok e r.
Boomerang e tok (String :- (CXXType :- r)) (CXXType :- r)
rVendorTypeQualifier forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"U" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (String :- a)
sourceName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rVoidType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"v" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rWchar_tType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"w" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rBoolType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"b" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rCharType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"c" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rSignedCharType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"a" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rUnsignedCharType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"h" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rShortType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"s" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rUnsignedShortType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"t" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rIntType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"i" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rUnsignedIntType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"j" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rLongType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"l" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rUnsignedLongType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"m" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rLongLongType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"x" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rUnsignedLongLongType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"y" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rInt128Type forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"n" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rUnsignedInt128Type forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"o" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rFloatType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"f" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rDoubleType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"d" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rLongDoubleType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"e" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rFloat128Type forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"g" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rEllipsisType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"z" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rChar32Type forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Di" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rChar16Type forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Ds" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rAutoType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Da" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok r (CXXType :- r)
rNullPtrType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Dn" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (String :- r) (CXXType :- r)
rVendorBuiltinType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"u" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (String :- a)
sourceName forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok ([CXXType] :- r) (CXXType :- r)
rExternCFunctionType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"FY" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([CXXType] :- a)
bareFunctionType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"E" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok ([CXXType] :- r) (CXXType :- r)
rFunctionType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"F" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([CXXType] :- a)
bareFunctionType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"E" forall a. Semigroup a => a -> a -> a
<>
            forall tok e r.
Boomerang e tok (Maybe Int :- (CXXType :- r)) (CXXType :- r)
rArrayTypeN forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"A" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r (Maybe a :- r)
rMaybe forall r. StringBoomerang r (Int :- r)
int forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"_" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
            forall tok e r.
Boomerang e tok (CXXType :- (CXXType :- r)) (CXXType :- r)
rPtrToMemberType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"M" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>

            forall tok e r. Boomerang e tok (Substitution :- r) (CXXType :- r)
rSubstitutionType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Substitution :- a)
substitution forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (Name :- r) (CXXType :- r)
rClassEnumType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Name :- a)
name forall a. Semigroup a => a -> a -> a
<>
            forall tok e r. Boomerang e tok (TemplateParam :- r) (CXXType :- r)
rTemplateParamType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (TemplateParam :- a)
templateParam

            -- Still need: array-type (E), decltype
          )

bareFunctionType :: Boomerang StringError String a ([CXXType] :- a)
bareFunctionType :: forall a. Boomerang StringError String a ([CXXType] :- a)
bareFunctionType = forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList1 forall a. Boomerang StringError String a (CXXType :- a)
cxxType

callOffset :: Boomerang StringError String a (CallOffset :- a)
callOffset :: forall a. Boomerang StringError String a (CallOffset :- a)
callOffset = ( forall tok e r.
Boomerang e tok (Int :- (Int :- r)) (CallOffset :- r)
rVirtualOffset forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"v" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. StringBoomerang r (Int :- r)
abiInt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"_" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. StringBoomerang r (Int :- r)
abiInt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"_" forall a. Semigroup a => a -> a -> a
<>
               forall tok e r. Boomerang e tok (Int :- r) (CallOffset :- r)
rNonVirtualOffset forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"h" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. StringBoomerang r (Int :- r)
abiInt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"_"
             )

cvQualifier :: Boomerang StringError String a (CVQualifier :- a)
cvQualifier :: forall a. Boomerang StringError String a (CVQualifier :- a)
cvQualifier = ( forall tok e r. Boomerang e tok r (CVQualifier :- r)
rRestrict forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"r" forall a. Semigroup a => a -> a -> a
<>
                forall tok e r. Boomerang e tok r (CVQualifier :- r)
rVolatile forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"V" forall a. Semigroup a => a -> a -> a
<>
                forall tok e r. Boomerang e tok r (CVQualifier :- r)
rConst forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"K"
              )

operator :: Boomerang StringError String a (Operator :- a)
operator :: forall a. Boomerang StringError String a (Operator :- a)
operator = ( forall tok e r. Boomerang e tok r (Operator :- r)
rOpNew forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"nw" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpNewArray forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"na" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpDelete forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"dl" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpDeleteArray forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"da" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpUPlus forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ps" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpUMinus forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ng" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpAddressOf forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ad" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpDeref forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"de" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpBitNot forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"co" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpPlus forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"pl" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpMinus forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"mi" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpMul forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ml" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpDiv forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"dv" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpMod forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"rm" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpBitAnd forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"an" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpBitOr forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"or" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpBitXor forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"eo" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"aS" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpPlusAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"pL" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpMinusAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"mI" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpMulAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"mL" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpDivAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"dV" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpModAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"rM" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpAndAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"aN" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpOrAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"oR" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpXorAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"eO" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpShl forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ls" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpShr forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"rs" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpShlAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"lS" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpShrAssign forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"rS" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpEquals forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"eq" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpNotEquals forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ne" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpLt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"lt" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpGt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"gt" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpLte forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"le" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpGte forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ge" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpNot forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"nt" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpAnd forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"aa" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpOr forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"oo" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpPlusPlus forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"pp" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpMinusMinus forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"mm" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpComma forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"cm" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpArrowStar forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"pm" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpArrow forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"pt" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpCall forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"cl" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpIndex forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"ix" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpQuestion forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"qu" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpSizeofType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"st" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpSizeofExpr forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"sz" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpAlignofType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"at" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (Operator :- r)
rOpAlignofExpr forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"az" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok (CXXType :- r) (Operator :- r)
rOpCast forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"cv" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
             forall tok e r.
Boomerang e tok (Int :- (String :- r)) (Operator :- r)
rOpVendor forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"v" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. StringBoomerang r (Int :- r)
abiInt forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (String :- a)
sourceName
           )

ctorDtor :: Boomerang StringError String a (CtorDtor :- a)
ctorDtor :: forall a. Boomerang StringError String a (CtorDtor :- a)
ctorDtor = ( forall tok e r. Boomerang e tok r (CtorDtor :- r)
rC1 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"C1" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (CtorDtor :- r)
rC2 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"C2" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (CtorDtor :- r)
rC3 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"C3" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (CtorDtor :- r)
rD0 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"D0" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (CtorDtor :- r)
rD1 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"D1" forall a. Semigroup a => a -> a -> a
<>
             forall tok e r. Boomerang e tok r (CtorDtor :- r)
rD2 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"D2"
           )

unqualifiedName :: Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName :: forall a. Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName = ( forall tok e r.
Boomerang e tok (Operator :- r) (UnqualifiedName :- r)
rOperatorName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Operator :- a)
operator forall a. Semigroup a => a -> a -> a
<>
                    forall tok e r.
Boomerang e tok (CtorDtor :- r) (UnqualifiedName :- r)
rCtorDtorName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CtorDtor :- a)
ctorDtor forall a. Semigroup a => a -> a -> a
<>
                    forall tok e r.
Boomerang e tok (String :- r) (UnqualifiedName :- r)
rSourceName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (String :- a)
sourceName
                  )

prefix :: Boomerang StringError String a (Prefix :- a)
prefix :: forall a. Boomerang StringError String a (Prefix :- a)
prefix = ( forall tok e r. Boomerang e tok (String :- r) (Prefix :- r)
rDataMemberPrefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (String :- a)
sourceName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"M" forall a. Semigroup a => a -> a -> a
<>
           forall tok e r.
Boomerang e tok (UnqualifiedName :- r) (Prefix :- r)
rUnqualifiedPrefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName forall a. Semigroup a => a -> a -> a
<>
           forall tok e r. Boomerang e tok (Substitution :- r) (Prefix :- r)
rSubstitutionPrefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Substitution :- a)
substitution forall a. Semigroup a => a -> a -> a
<>
           forall tok e r. Boomerang e tok (Substitution :- r) (Prefix :- r)
rSubstitutionPrefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall tok e r. Boomerang e tok r (Substitution :- r)
rSubStdNamespace forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"St" forall a. Semigroup a => a -> a -> a
<>
           forall tok e r. Boomerang e tok (TemplateParam :- r) (Prefix :- r)
rTemplateParamPrefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (TemplateParam :- a)
templateParam forall a. Semigroup a => a -> a -> a
<>
           forall tok e r. Boomerang e tok ([TemplateArg] :- r) (Prefix :- r)
rTemplateArgsPrefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([TemplateArg] :- a)
templateArgs
         )

name :: Boomerang StringError String a (Name :- a)
name :: forall a. Boomerang StringError String a (Name :- a)
name = ( forall tok e r.
Boomerang
  e
  tok
  ([CVQualifier] :- ([Prefix] :- (UnqualifiedName :- r)))
  (Name :- r)
rNestedName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"N" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList forall a. Boomerang StringError String a (CVQualifier :- a)
cvQualifier forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList1 forall a. Boomerang StringError String a (Prefix :- a)
prefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"E" forall a. Semigroup a => a -> a -> a
<>
         forall tok e r.
Boomerang
  e
  tok
  ([CVQualifier] :- ([Prefix] :- ([TemplateArg] :- r)))
  (Name :- r)
rNestedTemplateName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"N" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList forall a. Boomerang StringError String a (CVQualifier :- a)
cvQualifier forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList1 forall a. Boomerang StringError String a (Prefix :- a)
prefix forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([TemplateArg] :- a)
templateArgs forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"E" forall a. Semigroup a => a -> a -> a
<>
         forall tok e r.
Boomerang e tok (UName :- ([TemplateArg] :- r)) (Name :- r)
rUnscopedTemplateName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UName :- a)
unscopedName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([TemplateArg] :- a)
templateArgs forall a. Semigroup a => a -> a -> a
<>
         forall tok e r.
Boomerang e tok (Substitution :- ([TemplateArg] :- r)) (Name :- r)
rUnscopedTemplateSubstitution forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (Substitution :- a)
substitution forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a ([TemplateArg] :- a)
templateArgs forall a. Semigroup a => a -> a -> a
<>
         forall tok e r. Boomerang e tok (UName :- r) (Name :- r)
rUnscopedName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UName :- a)
unscopedName
       )

substitution :: Boomerang StringError String a (Substitution :- a)
substitution :: forall a. Boomerang StringError String a (Substitution :- a)
substitution = (
                 forall tok e r.
Boomerang e tok (Maybe String :- r) (Substitution :- r)
rSubstitution forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"S" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r (Maybe a :- r)
rMaybe forall a. Boomerang StringError String a (String :- a)
seq_id forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"_" forall a. Semigroup a => a -> a -> a
<>
                 -- rSubStdNamespace . lit "St" <> -- this one is not standalone, but must be a prefix
                 forall tok e r. Boomerang e tok r (Substitution :- r)
rSubStdAllocator forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Sa" forall a. Semigroup a => a -> a -> a
<>
                 forall tok e r. Boomerang e tok r (Substitution :- r)
rSubBasicString forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Sb" forall a. Semigroup a => a -> a -> a
<>
                 forall tok e r. Boomerang e tok r (Substitution :- r)
rSubBasicStringArgs forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Ss" forall a. Semigroup a => a -> a -> a
<>
                 forall tok e r. Boomerang e tok r (Substitution :- r)
rSubBasicIstream forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Si" forall a. Semigroup a => a -> a -> a
<>
                 forall tok e r. Boomerang e tok r (Substitution :- r)
rSubBasicOstream forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"So" forall a. Semigroup a => a -> a -> a
<>
                 forall tok e r. Boomerang e tok r (Substitution :- r)
rSubBasicIostream forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"Sd"
               )

-- | Reads the sequence ID of a Substitution parameter or Template
-- Argument parameter
seq_id :: Boomerang StringError String a ([Char] :- a)
seq_id :: forall a. Boomerang StringError String a (String :- a)
seq_id = forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList1 (forall r. (Char -> Bool) -> StringBoomerang r (Char :- r)
satisfy (\Char
c -> forall (t :: * -> *). Foldable t => t Bool -> Bool
and [ Char
c forall a. Eq a => a -> a -> Bool
/= Char
'_'
                                    , (Char -> Bool
isAsciiUpper Char
c Bool -> Bool -> Bool
|| Char -> Bool
isDigit Char
c)
                                    ]))

unscopedName :: Boomerang StringError String a (UName :- a)
unscopedName :: forall a. Boomerang StringError String a (UName :- a)
unscopedName = ( forall tok e r. Boomerang e tok (UnqualifiedName :- r) (UName :- r)
rUStdName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"St" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName forall a. Semigroup a => a -> a -> a
<>
                 forall tok e r. Boomerang e tok (UnqualifiedName :- r) (UName :- r)
rUName forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (UnqualifiedName :- a)
unqualifiedName
               )

templateArgs :: Boomerang StringError String a ([TemplateArg] :- a)
templateArgs :: forall a. Boomerang StringError String a ([TemplateArg] :- a)
templateArgs = forall r. String -> StringBoomerang r r
lit String
"I" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r ([a] :- r)
rList1 forall a. Boomerang StringError String a (TemplateArg :- a)
templateArg forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"E"

templateArg :: Boomerang StringError String a (TemplateArg :- a)
templateArg :: forall a. Boomerang StringError String a (TemplateArg :- a)
templateArg = (forall tok e r. Boomerang e tok (CXXType :- r) (TemplateArg :- r)
rTypeTemplateArg forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall a. Semigroup a => a -> a -> a
<>
               forall r. String -> StringBoomerang r r
lit String
"L" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall tok e r.
Boomerang e tok (ExprPrimary :- r) (TemplateArg :- r)
rExprPrimaryTemplateArg forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (ExprPrimary :- a)
exprPrimary forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"E"
              )

exprPrimary :: Boomerang (ParserError MajorMinorPos) String a (ExprPrimary :- a)
exprPrimary :: forall a. Boomerang StringError String a (ExprPrimary :- a)
exprPrimary = (forall tok e r.
Boomerang e tok (CXXType :- (Int :- r)) (ExprPrimary :- r)
rExprIntLit forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Boomerang StringError String a (CXXType :- a)
cxxType forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. StringBoomerang r (Int :- r)
abiInt )


templateParam :: Boomerang StringError String a (TemplateParam :- a)
templateParam :: forall a. Boomerang StringError String a (TemplateParam :- a)
templateParam = ( forall tok e r.
Boomerang e tok (Maybe String :- r) (TemplateParam :- r)
rTemplateParam forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"T" forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall e tok r a.
Boomerang e tok r (a :- r) -> Boomerang e tok r (Maybe a :- r)
rMaybe forall a. Boomerang StringError String a (String :- a)
seq_id forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall r. String -> StringBoomerang r r
lit String
"_" )

-- | Parse a length-prefixed string (does not handle newlines)
sourceName :: Boomerang (ParserError MajorMinorPos) String a (String :- a)
sourceName :: forall a. Boomerang StringError String a (String :- a)
sourceName = forall e tok a r.
Parser e tok a -> (a -> [tok -> tok]) -> Boomerang e tok r (a :- r)
val Parser StringError String String
pf String -> [String -> String]
sf
  where
    pf :: Parser StringError String String
pf = forall e tok a.
(tok -> Pos e -> [Either e ((a, tok), Pos e)]) -> Parser e tok a
Parser forall a b. (a -> b) -> a -> b
$ \String
tok Pos StringError
pos ->
      case String
tok of
        [] -> forall pos a. pos -> [ErrorMsg] -> [Either (ParserError pos) a]
mkParserError Pos StringError
pos [String -> ErrorMsg
EOI String
"input", String -> ErrorMsg
Expect String
"number"]
        String
_ ->
          case String -> Maybe (Int, String)
parseInt String
tok of
            Maybe (Int, String)
Nothing -> forall pos a. pos -> [ErrorMsg] -> [Either (ParserError pos) a]
mkParserError Pos StringError
pos [String -> ErrorMsg
Expect String
"length-prefixed string"]
            Just (Int
len, String
rest1) ->
              let (String
s, String
rest2) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
len String
rest1
                  pos' :: MajorMinorPos
pos' = forall i. Integral i => i -> MajorMinorPos -> MajorMinorPos
incMinor (forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall a. Show a => a -> String
show Int
len) forall a. Num a => a -> a -> a
+ forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) Pos StringError
pos
              in case forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s forall a. Eq a => a -> a -> Bool
== Int
len of
                Bool
True -> [forall a b. b -> Either a b
Right ((String
s, String
rest2), MajorMinorPos
pos')]
                Bool
False -> forall pos a. pos -> [ErrorMsg] -> [Either (ParserError pos) a]
mkParserError Pos StringError
pos [String -> ErrorMsg
EOI String
"input", String -> ErrorMsg
Expect String
"length-prefixed string"]
    sf :: String -> [String -> String]
sf String
b = [ (\String
string -> forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ forall a. Show a => a -> String
show (forall (t :: * -> *) a. Foldable t => t a -> Int
length String
b), String
b, String
string ]) ]

parseInt :: String -> Maybe (Int, String)
parseInt :: String -> Maybe (Int, String)
parseInt String
s =
  case forall a. Read a => ReadS a
reads String
s of
    [(Int
i, String
rest)] -> forall a. a -> Maybe a
Just (Int
i, String
rest)
    [(Int, String)]
_ -> forall a. Maybe a
Nothing

-- | In the Itanium ABI, negative numbers are prefixed by 'n' instead
-- of a negative sign.  This is an alternate parser to be used instead
-- of the 'int' parser that comes with boomerang.
abiInt :: Boomerang (ParserError MajorMinorPos) String a (Int :- a)
abiInt :: forall r. StringBoomerang r (Int :- r)
abiInt = forall e tok a r.
Parser e tok a -> (a -> [tok -> tok]) -> Boomerang e tok r (a :- r)
val Parser StringError String Int
pf forall {a}. (Ord a, Num a, Show a) => a -> [String -> String]
sf
  where
    pf :: Parser StringError String Int
pf = forall e tok a.
(tok -> Pos e -> [Either e ((a, tok), Pos e)]) -> Parser e tok a
Parser forall a b. (a -> b) -> a -> b
$ \String
tok Pos StringError
pos ->
      case String
tok of
        [] -> forall pos a. pos -> [ErrorMsg] -> [Either (ParserError pos) a]
mkParserError Pos StringError
pos [String -> ErrorMsg
EOI String
"input", String -> ErrorMsg
Expect String
"abi number"]
        Char
'n' : String
rest1 ->
          case String -> Maybe (Int, String)
parseInt String
rest1 of
            Maybe (Int, String)
Nothing -> forall pos a. pos -> [ErrorMsg] -> [Either (ParserError pos) a]
mkParserError Pos StringError
pos [String -> ErrorMsg
Expect String
"abi number"]
            Just (Int
num, String
rest2) ->
              let pos' :: MajorMinorPos
pos' = forall i. Integral i => i -> MajorMinorPos -> MajorMinorPos
incMinor (forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall a. Show a => a -> String
show Int
num) forall a. Num a => a -> a -> a
+ Int
1) Pos StringError
pos
              in [forall a b. b -> Either a b
Right ((forall a. Num a => a -> a
negate Int
num, String
rest2), MajorMinorPos
pos')]
        String
_ ->
          case String -> Maybe (Int, String)
parseInt String
tok of
            Maybe (Int, String)
Nothing -> forall pos a. pos -> [ErrorMsg] -> [Either (ParserError pos) a]
mkParserError Pos StringError
pos [String -> ErrorMsg
Expect String
"abi number"]
            Just (Int
num, String
rest2) ->
              let pos' :: MajorMinorPos
pos' = forall i. Integral i => i -> MajorMinorPos -> MajorMinorPos
incMinor (forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall a. Show a => a -> String
show Int
num)) Pos StringError
pos
              in [forall a b. b -> Either a b
Right ((Int
num, String
rest2), MajorMinorPos
pos')]
    sf :: a -> [String -> String]
sf a
b | a
b forall a. Ord a => a -> a -> Bool
>= a
0 = [ (\String
string -> forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ forall a. Show a => a -> String
show a
b, String
string ]) ]
         | Bool
otherwise = [ (\String
string -> forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ String
"n", forall a. Show a => a -> String
show a
b, String
string ]) ]