module DDC.Llvm.Syntax.Exp
(
Exp (..)
, typeOfExp
, Var (..)
, nameOfVar
, typeOfVar
, Name (..)
, Lit (..)
, typeOfLit)
where
import DDC.Llvm.Syntax.Type
data Exp
= XVar Var
| XLit Lit
| XUndef Type
deriving (Eq, Show)
typeOfExp :: Exp -> Type
typeOfExp xx
= case xx of
XVar var -> typeOfVar var
XLit lit -> typeOfLit lit
XUndef t -> t
data Var
= Var Name Type
deriving (Eq, Show)
nameOfVar :: Var -> Name
nameOfVar (Var n _) = n
typeOfVar :: Var -> Type
typeOfVar (Var _ t) = t
instance Ord Var where
compare (Var n1 _) (Var n2 _)
= compare n1 n2
data Name
= NameGlobal String
| NameLocal String
deriving (Show, Eq, Ord)
data Lit
= LitInt Type Integer
| LitFloat Type Double
| LitNull Type
| LitUndef Type
deriving (Eq, Show)
typeOfLit :: Lit -> Type
typeOfLit ll
= case ll of
LitInt t _ -> t
LitFloat t _ -> t
LitNull t -> t
LitUndef t -> t