module Language.C where data Program = Program [FunDef] deriving (Show) data FunDef = FunDef Type Name [(Type, Name)] StExpr | ProcDef Name [(Type, Name)] [Stmt] deriving (Show, Eq) data Type = TInt Bits | TUInt Bits | TFloat | TDouble | TPtr Type deriving (Show, Eq) data Bits = B8 | B16 | B32 | B64 deriving (Show, Eq) newtype Name = Name String deriving (Show, Eq, Ord) -- Statement expression: conceptually gcc's ({ ... }) data StExpr = StExpr [Stmt] Expr deriving (Show, Eq) data Stmt = SDecl Type Name (Maybe Expr) | SAsg Name Expr | SStore Name Expr Expr -- ^ name[expr] = expr | SCall Name [Expr] -- | @SFor ty i lo hi body@: @for (ty i = lo; i < hi; i++) body@ | SFor Type Name Expr Expr [Stmt] | SIf Expr [Stmt] [Stmt] deriving (Show, Eq) data Expr = EOp Expr String Expr | ENot Expr -- ^ @!expr@ | ELit String | EVar Name | ECall Name [Expr] | EIndex Name Expr | EPtrTo Expr | ESizeOf Type deriving (Show, Eq) fundefName :: FunDef -> Name fundefName (FunDef _ n _ _) = n fundefName (ProcDef n _ _) = n