packages feed

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