packages feed

hLLVM-0.5.0.0: src/Llvm/Syntax/Parser/Type.hs

module Llvm.Syntax.Parser.Type where
import Llvm.Data.Ast
import Llvm.Syntax.Parser.Basic


pType :: P Type
pType =
    do { t <- choice [ try (liftM Tprimitive pPrimType)
                     , pTypeName
                     --, upref
                     , array
                     , try pstruct
                     , vector
                     , struct
                     , pOther 
                     ]
       ; post t
       }
 where
--   upref    = chartok '\\' >> liftM TupRef decimal
   array    = brackets (avbody Tarray)
   vector   = angles (avbody Tvector)
   avbody f = do { n <- lexeme unsignedInt -- decimal
                 ; ignore $ chartok 'x'
                 ; t <- pType
                 ; return (f n t)
                 }
   struct   = liftM (Tstruct Unpacked) (braces (sepBy pType comma))
   pstruct  = do { ignore $ symbol "<{"
                 ; v <- sepBy pType comma
                 ; ignore $ symbol "}>"
                 ; return (Tstruct Packed v)
                 }
   pOther = choice [ reserved "opaque" >> return Topaque
                   , reserved "void" >> return Tvoid
                   ]


castTypeToMetaKind :: Type -> MetaKind
castTypeToMetaKind t = Mtype t                       


pMetaKind :: P MetaKind
pMetaKind = choice [ try (liftM castTypeToMetaKind pType)
                   , reserved "metadata" >> return Mmetadata
                   ]

pTypeName :: P Type
pTypeName = do { x <- pLocalId 
               ; case x of 
                 LocalIdNum n -> return $ Tno n
                 LocalIdAlphaNum s -> return $ Tname s
                 LocalIdDqString s -> return $ TquoteName s
               }


pStar :: P AddrSpace
pStar = option AddrSpaceUnspecified pAddrSpace >>= \x -> chartok '*' >> return x

post :: Type -> P Type
post t = do { pt <- option t (pStar >>= \x -> post (Tpointer t x))
            ; option pt $ do { fp <- pTypeParamList
                             ; fattrs <- many pFunAttr
                             ; post (Tfunction pt fp fattrs)
                             }
            }

pTypeI :: P TypePrimitive
pTypeI = (char 'i' >> liftM TpI unsignedInt)

pTypeF :: P TypePrimitive
pTypeF = (char 'f' >> liftM TpF unsignedInt)

pTypeV :: P TypePrimitive
pTypeV = (char 'v' >> liftM TpV unsignedInt)


pPrimType :: P TypePrimitive
pPrimType = choice [ try pTypeI
                   , reserved "half"      >> return TpHalf
                   , reserved "float"     >> return TpFloat
                   , reserved "fp128"     >> return TpFp128
                   , pTypeF
                   , reserved "label"     >> return TpLabel
                   , reserved "double"    >> return TpDouble
                   , reserved "x86_fp80"  >> return TpX86Fp80
                   , reserved "x86_mmx"   >> return TpX86Mmx
                   , reserved "ppc_fp128" >> return TpPpcFp128
                   , pTypeV
                   , reserved "null" >> return TpNull
                   ]
            
            
pTypeParamList :: P TypeParamList
pTypeParamList = do { ignore $ chartok '('
                    ; (l, f) <- args []
                    ; return $ TypeParamList l f
                    }
 where
   args :: [Type] -> P ([Type], Maybe VarArgParam)
   args l =  choice [ do { p <- pType
                         ; let l' = p:l
                         ; choice [ comma >> args l'
                                  , chartok ')' >> return (reverse l', Nothing)
                                  ]
                         }
                    , symbol "..." >> chartok ')' >> return (reverse l, Just VarArgParam)
                    , chartok ')' >> return (reverse l, Nothing)
                    ]
  

pFormalParamList :: P FormalParamList
pFormalParamList = do { ignore $ chartok '('
                      ; (l, f) <- args []
                      ; funAttrs <- many pFunAttr
                      ; return $ FormalParamList l f funAttrs
                      }
 where
   args :: [FormalParam] -> P ([FormalParam], Maybe VarArgParam)
   args l =  choice [ do { p <- param
                         ; let l' = p:l
                         ; choice [ comma >> args l'
                                  , chartok ')' >> return (reverse l', Nothing)
                                  ]
                         }
                    , symbol "..." >> chartok ')' >> return (reverse l, Just VarArgParam)
                    , chartok ')' >> return (reverse l, Nothing)
                    ]
    where
        param = choice [do { at <- pType
                           ; ar1 <- many pParamAttr
                           ; an <- opt pAlign
                           ; lv <- opt pLocalId
                           ; let lv' = maybe FimplicitParam FexplicitParam lv 
                           ; ar2 <- many pParamAttr
                           ; return $ FormalParamData at  ar1 an lv' ar2
                           }
                       , do { mt <- pMetaKind
                            ; lv <- opt pLocalId
                            ; let lv1 = maybe FimplicitParam FexplicitParam lv
                            ; return $ FormalParamMeta mt lv1
                            }
                       ]

pSelTy :: P Type
pSelTy = choice [ reserved "i1" >> return (Tprimitive $ TpI 1)
                , angles $ do { n <- unsignedInt -- decimal
                              ; ignore $ chartok 'x'
                              ; reserved "i1"
                              ; return $ Tvector n (Tprimitive $ TpI 1)
                              }
                , pTypeName
                ]