    -- Character classification

    module GHC.Parser.CharClass
            ( is_ident      -- Char# -> Bool
            , is_symbol     -- Char# -> Bool
            , is_any        -- Char# -> Bool
            , is_space      -- Char# -> Bool
            , is_lower      -- Char# -> Bool
            , is_upper      -- Char# -> Bool
            , is_digit      -- Char# -> Bool
            , is_alphanum   -- Char# -> Bool

            , is_decdigit, is_hexdigit, is_octdigit, is_bindigit
            , hexDigit, octDecDigit
            ) where

    import GHC.Prelude

    import Data.Char        ( ord, chr )
    import Data.Word
    import GHC.Utils.Panic

    -- Bit masks

    cIdent, cSymbol, cAny, cSpace, cLower, cUpper, cDigit :: Word8
    cIdent :: Word8
    cIdent  =  Word8
    1
    cSymbol :: Word8
    cSymbol =  Word8
    2
    cAny :: Word8
    cAny    =  Word8
    4
    cSpace :: Word8
    cSpace  =  Word8
    8
    cLower :: Word8
    cLower  = Word8
    16
    cUpper :: Word8
    cUpper  = Word8
    32
    cDigit :: Word8
    cDigit  = Word8
    64

    -- | The predicates below look costly, but aren't, GHC+GCC do a great job
    -- at the big case below.

    {-# INLINABLE is_ctype #-}
    is_ctype :: Word8 -> Char -> Bool
    is_ctype :: Word8 -> Char -> Bool
    is_ctype Word8
    mask Char
    c = Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Char
    '\127' Bool -> Bool -> Bool
    && (Char -> Word8
    charType Char
    c Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .&. Word8
    mask) Word8 -> Word8 -> Bool
    forall a. Eq a => a -> a -> Bool
    /= Word8
    0

    is_ident, is_symbol, is_any, is_space, is_lower, is_upper, is_digit,
        is_alphanum :: Char -> Bool
    is_ident :: Char -> Bool
    is_ident  = Word8 -> Char -> Bool
    is_ctype Word8
    cIdent
    is_symbol :: Char -> Bool
    is_symbol = Word8 -> Char -> Bool
    is_ctype Word8
    cSymbol
    is_any :: Char -> Bool
    is_any    = Word8 -> Char -> Bool
    is_ctype Word8
    cAny
    is_space :: Char -> Bool
    is_space  = Word8 -> Char -> Bool
    is_ctype Word8
    cSpace
    is_lower :: Char -> Bool
    is_lower  = Word8 -> Char -> Bool
    is_ctype Word8
    cLower
    is_upper :: Char -> Bool
    is_upper  = Word8 -> Char -> Bool
    is_ctype Word8
    cUpper
    is_digit :: Char -> Bool
    is_digit  = Word8 -> Char -> Bool
    is_ctype Word8
    cDigit
    is_alphanum :: Char -> Bool
    is_alphanum = Word8 -> Char -> Bool
    is_ctype (Word8
    cLowerWord8 -> Word8 -> Word8
    forall a. Num a => a -> a -> a
    +Word8
    cUpperWord8 -> Word8 -> Word8
    forall a. Num a => a -> a -> a
    +Word8
    cDigit)

    -- Utils

    hexDigit :: Char -> Int
    hexDigit :: Char -> Int
    hexDigit Char
    c | Char -> Bool
    is_decdigit Char
    c = Char -> Int
    ord Char
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Char -> Int
    ord Char
    '0'
               | Bool
    otherwise     = Char -> Int
    ord (Char -> Char
    to_lower Char
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Char -> Int
    ord Char
    'a' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    10

    octDecDigit :: Char -> Int
    octDecDigit :: Char -> Int
    octDecDigit Char
    c = Char -> Int
    ord Char
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Char -> Int
    ord Char
    '0'

    is_decdigit :: Char -> Bool
    is_decdigit :: Char -> Bool
    is_decdigit Char
    c
            =  Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    >= Char
    '0' Bool -> Bool -> Bool
    && Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Char
    '9'

    is_hexdigit :: Char -> Bool
    is_hexdigit :: Char -> Bool
    is_hexdigit Char
    c
            =  Char -> Bool
    is_decdigit Char
    c
            Bool -> Bool -> Bool
    || (Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    >= Char
    'a' Bool -> Bool -> Bool
    && Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Char
    'f')
            Bool -> Bool -> Bool
    || (Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    >= Char
    'A' Bool -> Bool -> Bool
    && Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Char
    'F')

    is_octdigit :: Char -> Bool
    is_octdigit :: Char -> Bool
    is_octdigit Char
    c = Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    >= Char
    '0' Bool -> Bool -> Bool
    && Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Char
    '7'

    is_bindigit :: Char -> Bool
    is_bindigit :: Char -> Bool
    is_bindigit Char
    c = Char
    c Char -> Char -> Bool
    forall a. Eq a => a -> a -> Bool
    == Char
    '0' Bool -> Bool -> Bool
    || Char
    c Char -> Char -> Bool
    forall a. Eq a => a -> a -> Bool
    == Char
    '1'

    to_lower :: Char -> Char
    to_lower :: Char -> Char
    to_lower Char
    c
      | Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    >=  Char
    'A' Bool -> Bool -> Bool
    && Char
    c Char -> Char -> Bool
    forall a. Ord a => a -> a -> Bool
    <= Char
    'Z' = Int -> Char
    chr (Char -> Int
    ord Char
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Char -> Int
    ord Char
    'A' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Char -> Int
    ord Char
    'a'))
      | Bool
    otherwise = Char
    c

    charType :: Char -> Word8
    charType :: Char -> Word8
    charType Char
    c = case Char
    c of
       Char
    '\0'   -> Word8
    0                             -- \000
       Char
    '\1'   -> Word8
    0                             -- \001
       Char
    '\2'   -> Word8
    0                             -- \002
       Char
    '\3'   -> Word8
    0                             -- \003
       Char
    '\4'   -> Word8
    0                             -- \004
       Char
    '\5'   -> Word8
    0                             -- \005
       Char
    '\6'   -> Word8
    0                             -- \006
       Char
    '\7'   -> Word8
    0                             -- \007
       Char
    '\8'   -> Word8
    0                             -- \010
       Char
    '\9'   -> Word8
    cSpace                        -- \t  (not allowed in strings, so !cAny)
       Char
    '\10'  -> Word8
    cSpace                        -- \n  (ditto)
       Char
    '\11'  -> Word8
    cSpace                        -- \v  (ditto)
       Char
    '\12'  -> Word8
    cSpace                        -- \f  (ditto)
       Char
    '\13'  -> Word8
    cSpace                        --  ^M (ditto)
       Char
    '\14'  -> Word8
    0                             -- \016
       Char
    '\15'  -> Word8
    0                             -- \017
       Char
    '\16'  -> Word8
    0                             -- \020
       Char
    '\17'  -> Word8
    0                             -- \021
       Char
    '\18'  -> Word8
    0                             -- \022
       Char
    '\19'  -> Word8
    0                             -- \023
       Char
    '\20'  -> Word8
    0                             -- \024
       Char
    '\21'  -> Word8
    0                             -- \025
       Char
    '\22'  -> Word8
    0                             -- \026
       Char
    '\23'  -> Word8
    0                             -- \027
       Char
    '\24'  -> Word8
    0                             -- \030
       Char
    '\25'  -> Word8
    0                             -- \031
       Char
    '\26'  -> Word8
    0                             -- \032
       Char
    '\27'  -> Word8
    0                             -- \033
       Char
    '\28'  -> Word8
    0                             -- \034
       Char
    '\29'  -> Word8
    0                             -- \035
       Char
    '\30'  -> Word8
    0                             -- \036
       Char
    '\31'  -> Word8
    0                             -- \037
       Char
    '\32'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSpace               --
       Char
    '\33'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- !
       Char
    '\34'  -> Word8
    cAny                          -- "
       Char
    '\35'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              --  #
       Char
    '\36'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              --  $
       Char
    '\37'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- %
       Char
    '\38'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- &
       Char
    '\39'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent               -- '
       Char
    '\40'  -> Word8
    cAny                          -- (
       Char
    '\41'  -> Word8
    cAny                          -- )
       Char
    '\42'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              --  *
       Char
    '\43'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- +
       Char
    '\44'  -> Word8
    cAny                          -- ,
       Char
    '\45'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- -
       Char
    '\46'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- .
       Char
    '\47'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              --  /
       Char
    '\48'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 0
       Char
    '\49'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 1
       Char
    '\50'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 2
       Char
    '\51'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 3
       Char
    '\52'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 4
       Char
    '\53'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 5
       Char
    '\54'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 6
       Char
    '\55'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 7
       Char
    '\56'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 8
       Char
    '\57'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cDigit   -- 9
       Char
    '\58'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- :
       Char
    '\59'  -> Word8
    cAny                          -- ;
       Char
    '\60'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- <
       Char
    '\61'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- =
       Char
    '\62'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- >
       Char
    '\63'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- ?
       Char
    '\64'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- @
       Char
    '\65'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- A
       Char
    '\66'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- B
       Char
    '\67'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- C
       Char
    '\68'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- D
       Char
    '\69'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- E
       Char
    '\70'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- F
       Char
    '\71'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- G
       Char
    '\72'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- H
       Char
    '\73'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- I
       Char
    '\74'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- J
       Char
    '\75'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- K
       Char
    '\76'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- L
       Char
    '\77'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- M
       Char
    '\78'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- N
       Char
    '\79'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- O
       Char
    '\80'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- P
       Char
    '\81'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- Q
       Char
    '\82'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- R
       Char
    '\83'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- S
       Char
    '\84'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- T
       Char
    '\85'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- U
       Char
    '\86'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- V
       Char
    '\87'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- W
       Char
    '\88'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- X
       Char
    '\89'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- Y
       Char
    '\90'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cUpper   -- Z
       Char
    '\91'  -> Word8
    cAny                          -- [
       Char
    '\92'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- backslash
       Char
    '\93'  -> Word8
    cAny                          -- ]
       Char
    '\94'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              --  ^
       Char
    '\95'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- _
       Char
    '\96'  -> Word8
    cAny                          -- `
       Char
    '\97'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- a
       Char
    '\98'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- b
       Char
    '\99'  -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- c
       Char
    '\100' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- d
       Char
    '\101' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- e
       Char
    '\102' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- f
       Char
    '\103' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- g
       Char
    '\104' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- h
       Char
    '\105' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- i
       Char
    '\106' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- j
       Char
    '\107' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- k
       Char
    '\108' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- l
       Char
    '\109' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- m
       Char
    '\110' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- n
       Char
    '\111' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- o
       Char
    '\112' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- p
       Char
    '\113' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- q
       Char
    '\114' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- r
       Char
    '\115' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- s
       Char
    '\116' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- t
       Char
    '\117' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- u
       Char
    '\118' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- v
       Char
    '\119' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- w
       Char
    '\120' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- x
       Char
    '\121' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- y
       Char
    '\122' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cIdent  Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cLower   -- z
       Char
    '\123' -> Word8
    cAny                          -- {
       Char
    '\124' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              --  |
       Char
    '\125' -> Word8
    cAny                          -- }
       Char
    '\126' -> Word8
    cAny Word8 -> Word8 -> Word8
    forall a. Bits a => a -> a -> a
    .|. Word8
    cSymbol              -- ~
       Char
    '\127' -> Word8
    0                             -- \177
       Char
    _ -> String -> Word8
    forall a. HasCallStack => String -> a
    panic (String
    "charType: " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ Char -> String
    forall a. Show a => a -> String
    show Char
    c)