cimple-0.0.4: src/Language/Cimple/AST.hs
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE StrictData #-}
module Language.Cimple.AST
( AssignOp (..)
, BinaryOp (..)
, UnaryOp (..)
, LiteralType (..)
, Node (..)
, Scope (..)
, CommentStyle (..)
) where
import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics (Generic)
data Node a lexeme
= Attr a
-- Preprocessor
| PreprocInclude lexeme
| PreprocDefine lexeme
| PreprocDefineConst lexeme (Node a lexeme)
| PreprocDefineMacro lexeme [Node a lexeme] (Node a lexeme)
| PreprocIf (Node a lexeme) [Node a lexeme] (Node a lexeme)
| PreprocIfdef lexeme [Node a lexeme] (Node a lexeme)
| PreprocIfndef lexeme [Node a lexeme] (Node a lexeme)
| PreprocElse [Node a lexeme]
| PreprocElif (Node a lexeme) [Node a lexeme] (Node a lexeme)
| PreprocUndef lexeme
| PreprocDefined lexeme
| PreprocScopedDefine (Node a lexeme) [Node a lexeme] (Node a lexeme)
| MacroBodyStmt [Node a lexeme]
| MacroBodyFunCall (Node a lexeme)
| MacroParam lexeme
| StaticAssert (Node a lexeme) lexeme
-- Comments
| LicenseDecl lexeme [Node a lexeme]
| CopyrightDecl lexeme (Maybe lexeme) [lexeme]
| Comment CommentStyle lexeme [Node a lexeme] lexeme
| CommentBlock lexeme
| CommentWord lexeme
| Commented (Node a lexeme) (Node a lexeme)
-- Namespace-like blocks
| ExternC [Node a lexeme]
| Class Scope lexeme [Node a lexeme] [Node a lexeme]
| Namespace Scope lexeme [Node a lexeme]
-- Statements
| CompoundStmt [Node a lexeme]
| Break
| Goto lexeme
| Continue
| Return (Maybe (Node a lexeme))
| SwitchStmt (Node a lexeme) [Node a lexeme]
| IfStmt (Node a lexeme) [Node a lexeme] (Maybe (Node a lexeme))
| ForStmt (Node a lexeme) (Node a lexeme) (Node a lexeme) [Node a lexeme]
| WhileStmt (Node a lexeme) [Node a lexeme]
| DoWhileStmt [Node a lexeme] (Node a lexeme)
| Case (Node a lexeme) (Node a lexeme)
| Default (Node a lexeme)
| Label lexeme (Node a lexeme)
-- Variable declarations
| VLA (Node a lexeme) lexeme (Node a lexeme)
| VarDecl (Node a lexeme) (Node a lexeme)
| Declarator (Node a lexeme) (Maybe (Node a lexeme))
| DeclSpecVar lexeme
| DeclSpecArray (Node a lexeme) (Maybe (Node a lexeme))
-- Expressions
| InitialiserList [Node a lexeme]
| UnaryExpr UnaryOp (Node a lexeme)
| BinaryExpr (Node a lexeme) BinaryOp (Node a lexeme)
| TernaryExpr (Node a lexeme) (Node a lexeme) (Node a lexeme)
| AssignExpr (Node a lexeme) AssignOp (Node a lexeme)
| ParenExpr (Node a lexeme)
| CastExpr (Node a lexeme) (Node a lexeme)
| CompoundExpr (Node a lexeme) (Node a lexeme)
| SizeofExpr (Node a lexeme)
| SizeofType (Node a lexeme)
| LiteralExpr LiteralType lexeme
| VarExpr lexeme
| MemberAccess (Node a lexeme) lexeme
| PointerAccess (Node a lexeme) lexeme
| ArrayAccess (Node a lexeme) (Node a lexeme)
| FunctionCall (Node a lexeme) [Node a lexeme]
| CommentExpr (Node a lexeme) (Node a lexeme)
-- Type definitions
| EnumClass lexeme [Node a lexeme]
| EnumConsts (Maybe lexeme) [Node a lexeme]
| EnumDecl lexeme [Node a lexeme] lexeme
| Enumerator lexeme (Maybe (Node a lexeme))
| ClassForward lexeme [Node a lexeme]
| Typedef (Node a lexeme) lexeme
| TypedefFunction (Node a lexeme)
| Struct lexeme [Node a lexeme]
| Union lexeme [Node a lexeme]
| MemberDecl (Node a lexeme) (Node a lexeme) (Maybe lexeme)
| TyConst (Node a lexeme)
| TyPointer (Node a lexeme)
| TyStruct lexeme
| TyFunc lexeme
| TyStd lexeme
| TyVar lexeme
| TyUserDefined lexeme
-- Functions
| FunctionDecl Scope (Node a lexeme) (Maybe (Node a lexeme))
| FunctionDefn Scope (Node a lexeme) [Node a lexeme]
| FunctionPrototype (Node a lexeme) lexeme [Node a lexeme]
| FunctionParam (Node a lexeme) (Node a lexeme)
| Event lexeme (Node a lexeme)
| EventParams [Node a lexeme]
| Property (Node a lexeme) (Node a lexeme) [Node a lexeme]
| Accessor lexeme [Node a lexeme] (Maybe (Node a lexeme))
| ErrorDecl lexeme [Node a lexeme]
| ErrorList [Node a lexeme]
| ErrorFor lexeme
| Ellipsis
-- Constants
| ConstDecl (Node a lexeme) lexeme
| ConstDefn Scope (Node a lexeme) lexeme (Node a lexeme)
deriving (Show, Eq, Generic, Functor, Foldable, Traversable)
instance (FromJSON a, FromJSON lexeme) => FromJSON (Node a lexeme)
instance (ToJSON a, ToJSON lexeme) => ToJSON (Node a lexeme)
data AssignOp
= AopEq
| AopMul
| AopDiv
| AopPlus
| AopMinus
| AopBitAnd
| AopBitOr
| AopBitXor
| AopMod
| AopLsh
| AopRsh
deriving (Show, Eq, Generic)
instance FromJSON AssignOp
instance ToJSON AssignOp
data BinaryOp
= BopNe
| BopEq
| BopOr
| BopBitXor
| BopBitOr
| BopAnd
| BopBitAnd
| BopDiv
| BopMul
| BopMod
| BopPlus
| BopMinus
| BopLt
| BopLe
| BopLsh
| BopGt
| BopGe
| BopRsh
deriving (Show, Eq, Generic)
instance FromJSON BinaryOp
instance ToJSON BinaryOp
data UnaryOp
= UopNot
| UopNeg
| UopMinus
| UopAddress
| UopDeref
| UopIncr
| UopDecr
deriving (Show, Eq, Generic)
instance FromJSON UnaryOp
instance ToJSON UnaryOp
data LiteralType
= Char
| Int
| Bool
| String
| ConstId
deriving (Show, Eq, Generic)
instance FromJSON LiteralType
instance ToJSON LiteralType
data Scope
= Global
| Static
deriving (Show, Eq, Generic)
instance FromJSON Scope
instance ToJSON Scope
data CommentStyle
= Regular
| Doxygen
| Block
deriving (Show, Eq, Generic)
instance FromJSON CommentStyle
instance ToJSON CommentStyle