    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Text.ParserCombinators.Parsec.Expr
    -- Copyright   :  (c) Paolo Martini 2007
    -- License     :  BSD-style (see the LICENSE file)
    --
    -- Maintainer  :  derek.a.elkins@gmail.com
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -- Parsec compatibility module
    --
    -----------------------------------------------------------------------------

    module Text.ParserCombinators.Parsec.Expr
        ( Assoc (AssocNone,AssocLeft,AssocRight),
          Operator(..),
          OperatorTable,
          buildExpressionParser
        ) where

    import Text.Parsec.Expr(Assoc(..))
    import qualified Text.Parsec.Expr as N
    import Text.ParserCombinators.Parsec(GenParser)

    import Control.Monad.Identity

    data Operator tok st a   = Infix  (GenParser tok st (a -> a -> a)) Assoc
                             | Prefix (GenParser tok st (a -> a))
                             | Postfix (GenParser tok st (a -> a))

    type OperatorTable tok st a = [[Operator tok st a]]

    convert :: Operator tok st a -> N.Operator [tok] st Identity a
    convert (Infix p a) = N.Infix p a
    convert (Prefix p)  = N.Prefix p
    convert (Postfix p)  = N.Postfix p

    buildExpressionParser :: OperatorTable tok st a
                          -> GenParser tok st a
                          -> GenParser tok st a
    buildExpressionParser = N.buildExpressionParser . map (map convert)