-- AST for C++ code {- based on: language-c-0.3.1.1: Analysis and generation of C code Language.C.Syntax.AST Abstract syntax of C++ source and header files. -} module Language.CPP.Syntax.AST where data CPPFile = CPPFile { cppMacroStm :: [CPPMacroStm], cppUsing :: [String], cppTranslUnit :: CPPNamespace } deriving (Eq,Ord,Show) data CPPMacroStm = CPPMacroIncludeUser String | CPPMacroIncludeSys String | CPPMacroDefine { cppMacroDefName:: String, cppMacroDefArgs :: Maybe [String], cppMacroDefExpr :: String } deriving (Eq,Ord,Show) data CPPElement = CPPElemNamespace (String,CPPNamespace) | CPPElemDecl CPPDecl | CPPElemDef CPPDef | CPPElemClass CPPClass deriving (Eq,Ord,Show) data CPPNamespace = CPPNamespace [CPPElement] deriving (Eq,Ord,Show) data CPPClass = CPPClass { cppClassName :: String, cppClassInherit :: [(CPPVisibility,CPPType)], cppClassDecls :: [(CPPVisibility,CPPDecl)], cppClassDefs :: [(CPPVisibility,CPPDef)], cppClassConstrs :: [(CPPVisibility,CPPConstr)] } deriving (Eq,Ord,Show) data CPPVisibility = CPPPublic | CPPProtected | CPPPrivate deriving (Eq,Ord,Show) -- TODO: function pointers -- TODO: struct/union/enum data CPPType = CPPTypePrim String | CPPArray [CPPQual] CPPType (Maybe CPPExpr) | CPPPtr [CPPQual] CPPType | CPPRef [CPPQual] CPPType | CPPTempl String [CPPType] deriving (Eq,Ord,Show) data CPPStorSpec = CPPAuto | CPPRegister | CPPStatic | CPPExtern | CPPTypedef | CPPInline | CPPVirtual deriving (Eq,Ord,Show) data CPPQual = CPPQualConst | CPPQualVolatile deriving (Eq,Ord,Show) data CPPInit = CPPInitValue CPPExpr | CPPInitCall [CPPExpr] | CPPInitArray [CPPExpr] deriving (Eq,Ord,Show) data CPPDecl = CPPDecl { cppDeclName :: Maybe String, cppType :: CPPType, cppTypeQual :: [CPPQual], cppTypeStor :: [CPPStorSpec], cppDeclInit :: Maybe CPPInit } deriving (Eq,Ord,Show) data CPPDef = CPPDef { cppDefName :: String, cppDefRetType :: CPPType, cppDefStor :: [CPPStorSpec], cppDefQual :: [CPPQual], cppDefArgs :: [CPPDecl], cppDefBody :: Maybe CPPStat } deriving (Eq,Ord,Show) data CPPConstr = CPPConstr { cppConstrStor :: [CPPStorSpec], cppConstrArgs :: [CPPDecl], cppConstrBody :: Maybe CPPStat, cppConstrInit :: [(Either CPPExpr CPPType,[CPPExpr])] } deriving (Eq,Ord,Show) data CPPStat = CPPLabel String CPPStat | CPPCase CPPExpr CPPStat | CPPDefault CPPStat | CPPSimple CPPExpr | CPPCompound [CPPBlockItem] | CPPVerbStat [String] | CPPIf CPPExpr CPPStat (Maybe CPPStat) | CPPSwitch CPPExpr CPPStat | CPPWhile CPPExpr Bool CPPStat | CPPFor (Either (Maybe CPPExpr) CPPDecl) (Maybe CPPExpr) (Maybe CPPExpr) CPPStat | CPPGoto String | CPPCont | CPPBreak | CPPReturn (Maybe CPPExpr) | CPPDelete CPPExpr deriving (Eq,Ord,Show) data CPPBlockItem = CPPStatement CPPStat | CPPBlockDecl CPPDecl | CPPComment String deriving (Eq,Ord,Show) data CPPExpr = CPPComma [CPPExpr] | CPPAssign CPPExpr CPPAssignOp CPPExpr | CPPBinary CPPExpr CPPBinaryOp CPPExpr | CPPUnary CPPUnaryOp CPPExpr | CPPCond CPPExpr (Maybe CPPExpr) CPPExpr | CPPCast CPPType CPPExpr | CPPSizeOfExpr CPPExpr | CPPSizeOfType CPPType | CPPIndex CPPExpr CPPExpr | CPPCall CPPExpr [CPPExpr] | CPPMember CPPExpr String Bool | CPPVar String | CPPConst CPPConst | CPPNew CPPType [CPPExpr] deriving (Eq,Ord,Show) data CPPConst = CPPConstInt Integer | CPPConstChar String | CPPConstFloat String | CPPConstString String deriving (Eq,Ord,Show) data CPPAssignOp = CPPAssOp | CPPAssOpMul | CPPAssOpDiv | CPPAssOpRmd | CPPAssOpAdd | CPPAssOpSub | CPPAssOpShl | CPPAssOpShr | CPPAssOpAnd | CPPAssOpOr | CPPAssOpXor deriving (Eq,Ord,Show) data CPPUnaryOp = CPPOpPreInc | CPPOpPostInc | CPPOpPreDec | CPPOpPostDec | CPPOpAdr | CPPOpInd | CPPOpPlus | CPPOpMinus | CPPOpComp | CPPOpNeg deriving (Eq,Ord,Show) data CPPBinaryOp = CPPOpMul | CPPOpDiv | CPPOpRmd | CPPOpAdd | CPPOpSub | CPPOpShl | CPPOpShr | CPPOpLe | CPPOpGr | CPPOpLeq | CPPOpGeq | CPPOpEq | CPPOpNeq | CPPOpAnd | CPPOpOr | CPPOpXor | CPPOpLAnd | CPPOpLOr deriving (Eq,Ord,Show)