    {-# LANGUAGE DeriveDataTypeable #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Language.C.Syntax.Ops
    -- Copyright   :  (c) 2008 Benedikt Huber
    -- License     :  BSD-style
    -- Maintainer  : benedikt.huber@gmail.com
    -- Stability   : experimental
    -- Portability : ghc
    --
    -- Unary, binary and asssignment operators. Exported via AST.
    -----------------------------------------------------------------------------
    module Language.C.Syntax.Ops (
    -- * Assignment operators
    CAssignOp(..),
    -- * Unary operators
    CUnaryOp(..),
    -- * Binary operators
    CBinaryOp(..),
    )
    where
    import Data.Generics
    -- | C assignment operators (K&R A7.17)
    data CAssignOp = CAssignOp
                   | CMulAssOp
                   | CDivAssOp
                   | CRmdAssOp              -- ^ remainder and assignment
                   | CAddAssOp
                   | CSubAssOp
                   | CShlAssOp
                   | CShrAssOp
                   | CAndAssOp
                   | CXorAssOp
                   | COrAssOp
                   deriving (Eq, Ord,Data,Typeable)
    instance Show CAssignOp where
      show CAssignOp = "="
      show CMulAssOp = "*="
      show CDivAssOp = "/="
      show CRmdAssOp = "%="
      show CAddAssOp = "+="
      show CSubAssOp = "-="
      show CShlAssOp = "<<="
      show CShrAssOp = ">>="
      show CAndAssOp = "&="
      show CXorAssOp = "^="
      show COrAssOp  = "|="

    -- | C binary operators (K&R A7.6-15)
    --
    data CBinaryOp = CMulOp
                   | CDivOp
                   | CRmdOp                 -- ^ remainder of division
                   | CAddOp
                   | CSubOp
                   | CShlOp                 -- ^ shift left
                   | CShrOp                 -- ^ shift right
                   | CLeOp                  -- ^ less
                   | CGrOp                  -- ^ greater
                   | CLeqOp                 -- ^ less or equal
                   | CGeqOp                 -- ^ greater or equal
                   | CEqOp                  -- ^ equal
                   | CNeqOp                 -- ^ not equal
                   | CAndOp                 -- ^ bitwise and
                   | CXorOp                 -- ^ exclusive bitwise or
                   | COrOp                  -- ^ inclusive bitwise or
                   | CLndOp                 -- ^ logical and
                   | CLorOp                 -- ^ logical or
                   deriving (Eq,Ord,Data,Typeable)
    instance Show CBinaryOp where
      show CMulOp = "*"
      show CDivOp = "/"
      show CRmdOp = "%"
      show CAddOp = "+"
      show CSubOp = "-"
      show CShlOp = "<<"
      show CShrOp = ">>"
      show CLeOp  = "<"
      show CGrOp  = ">"
      show CLeqOp = "<="
      show CGeqOp = ">="
      show CEqOp  = "=="
      show CNeqOp = "!="
      show CAndOp = "&"
      show CXorOp = "^"
      show COrOp  = "|"
      show CLndOp = "&&"
      show CLorOp = "||"

    -- | C unary operator (K&R A7.3-4)
    --
    data CUnaryOp = CPreIncOp               -- ^ prefix increment operator
                  | CPreDecOp               -- ^ prefix decrement operator
                  | CPostIncOp              -- ^ postfix increment operator
                  | CPostDecOp              -- ^ postfix decrement operator
                  | CAdrOp                  -- ^ address operator
                  | CIndOp                  -- ^ indirection operator
                  | CPlusOp                 -- ^ prefix plus
                  | CMinOp                  -- ^ prefix minus
                  | CCompOp                 -- ^ one's complement
                  | CNegOp                  -- ^ logical negation
                  deriving (Eq,Ord,Data,Typeable)
    instance Show CUnaryOp where
      show CPreIncOp  = "++"
      show CPreDecOp  = "--"
      show CPostIncOp = "++"
      show CPostDecOp = "--"
      show CAdrOp     = "&"
      show CIndOp     = "*"
      show CPlusOp    = "+"
      show CMinOp     = "-"
      show CCompOp    = "~"
      show CNegOp     = "!"