    module Language.C99.Simple.Expr where

    import Prelude hiding (LT, GT)

    import Language.C99.Simple.AST

    -- Unary Operators
    (.++) :: Expr -> Expr
    .++ :: Expr -> Expr
    (.++) = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    Inc

    (.--) :: Expr -> Expr
    .-- :: Expr -> Expr
    (.--) = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    Dec

    ref :: Expr -> Expr
    ref :: Expr -> Expr
    ref = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    Ref

    deref :: Expr -> Expr
    deref :: Expr -> Expr
    deref = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    DeRef

    pos :: Expr -> Expr
    pos :: Expr -> Expr
    pos = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    Plus

    neg :: Expr -> Expr
    neg :: Expr -> Expr
    neg = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    Min

    (.~) :: Expr -> Expr
    .~ :: Expr -> Expr
    (.~) = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    BoolNot

    (.!) :: Expr -> Expr
    .! :: Expr -> Expr
    (.!) = UnaryOp -> Expr -> Expr
    UnaryOp UnaryOp
    Not

    -- Binary Operators
    (.*) :: Expr -> Expr -> Expr
    .* :: Expr -> Expr -> Expr
    (.*) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Mult

    (./) :: Expr -> Expr -> Expr
    ./ :: Expr -> Expr -> Expr
    (./) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Div

    (.%) :: Expr -> Expr -> Expr
    .% :: Expr -> Expr -> Expr
    (.%) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Mod

    (.+) :: Expr -> Expr -> Expr
    .+ :: Expr -> Expr -> Expr
    (.+) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Add

    (.-) :: Expr -> Expr -> Expr
    .- :: Expr -> Expr -> Expr
    (.-) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Sub

    (.<<) :: Expr -> Expr -> Expr
    .<< :: Expr -> Expr -> Expr
    (.<<) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    ShiftL

    (.>>) :: Expr -> Expr -> Expr
    .>> :: Expr -> Expr -> Expr
    (.>>) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    ShiftR

    (.<) :: Expr -> Expr -> Expr
    .< :: Expr -> Expr -> Expr
    (.<) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    LT

    (.>) :: Expr -> Expr -> Expr
    .> :: Expr -> Expr -> Expr
    (.>) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    GT

    (.<=) :: Expr -> Expr -> Expr
    .<= :: Expr -> Expr -> Expr
    (.<=) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    LE

    (.>=) :: Expr -> Expr -> Expr
    .>= :: Expr -> Expr -> Expr
    (.>=) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    GE

    (.==) :: Expr -> Expr -> Expr
    .== :: Expr -> Expr -> Expr
    (.==) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Eq

    (.!=) :: Expr -> Expr -> Expr
    .!= :: Expr -> Expr -> Expr
    (.!=) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    NEq

    (.&) :: Expr -> Expr -> Expr
    .& :: Expr -> Expr -> Expr
    (.&) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    And

    (.^) :: Expr -> Expr -> Expr
    .^ :: Expr -> Expr -> Expr
    (.^) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    XOr

    (.|) :: Expr -> Expr -> Expr
    .| :: Expr -> Expr -> Expr
    (.|) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    Or

    (.&&) :: Expr -> Expr -> Expr
    .&& :: Expr -> Expr -> Expr
    (.&&) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    LAnd

    (.||) :: Expr -> Expr -> Expr
    .|| :: Expr -> Expr -> Expr
    (.||) = BinaryOp -> Expr -> Expr -> Expr
    BinaryOp BinaryOp
    LOr

    -- Assignment operators
    (.=) :: Expr -> Expr -> Expr
    .= :: Expr -> Expr -> Expr
    (.=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    Assign

    (.*=) :: Expr -> Expr -> Expr
    .*= :: Expr -> Expr -> Expr
    (.*=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignMult

    (./=) :: Expr -> Expr -> Expr
    ./= :: Expr -> Expr -> Expr
    (./=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignDiv

    (.%=) :: Expr -> Expr -> Expr
    .%= :: Expr -> Expr -> Expr
    (.%=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignMod

    (.+=) :: Expr -> Expr -> Expr
    .+= :: Expr -> Expr -> Expr
    (.+=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignAdd

    (.-=) :: Expr -> Expr -> Expr
    .-= :: Expr -> Expr -> Expr
    (.-=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignSub

    (.<<=) :: Expr -> Expr -> Expr
    .<<= :: Expr -> Expr -> Expr
    (.<<=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignShiftL

    (.>>=) :: Expr -> Expr -> Expr
    .>>= :: Expr -> Expr -> Expr
    (.>>=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignShiftR

    (.&=) :: Expr -> Expr -> Expr
    .&= :: Expr -> Expr -> Expr
    (.&=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignAnd

    (.^=) :: Expr -> Expr -> Expr
    .^= :: Expr -> Expr -> Expr
    (.^=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignXOr

    (.|=) :: Expr -> Expr -> Expr
    .|= :: Expr -> Expr -> Expr
    (.|=) = AssignOp -> Expr -> Expr -> Expr
    AssignOp AssignOp
    AssignOr