-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Generalization of parsec's expression parser. -- -- Generalization of parsec's expression parser. @package expression-parser @version 0.1 module Text.ParserCombinators.Expression -- | This data type specifies the associativity of operators: left, right -- or none. data Assoc AssocNone :: Assoc AssocLeft :: Assoc AssocRight :: Assoc -- | This data type specifies operators that work on values of type -- a. An operator is either binary infix or unary prefix or -- postfix. A binary operator has also an associated associativity. data Operator p a Infix :: (p (a -> a -> a)) -> Assoc -> Operator p a Prefix :: (p (a -> a)) -> Operator p a Postfix :: (p (a -> a)) -> Operator p a -- | An OperatorTable is a list of Operator lists. The -- list is ordered in descending precedence. All operators in one list -- have the same precedence (but may have a different associativity). type OperatorTable p a = [[Operator p a]] -- | buildExpressionParser table term builds an expression parser -- for terms term with operators from table, taking the -- associativity and precedence specified in table into account. -- Prefix and postfix operators of the same precedence can only occur -- once (i.e. --2 is not allowed if - is prefix -- negate). Prefix and postfix operators of the same precedence associate -- to the left (i.e. if ++ is postfix increment, than -- -2++ equals -1, not -3). -- -- The buildExpressionParser takes care of all the complexity -- involved in building expression parser. Here is an example of an -- expression parser that handles prefix signs, postfix increment and -- basic arithmetic. -- --
-- expr = buildExpressionParser table term
-- <?> "expression"
--
-- term = parens expr
-- <|> natural
-- <?> "simple expression"
--
-- table = [ [prefix "-" negate, prefix "+" id ]
-- , [postfix "++" (+1)]
-- , [binary "*" (*) AssocLeft, binary "/" (div) AssocLeft ]
-- , [binary "+" (+) AssocLeft, binary "-" (-) AssocLeft ]
-- ]
--
-- binary name fun assoc = Infix (do{ reservedOp name; return fun }) assoc
-- prefix name fun = Prefix (do{ reservedOp name; return fun })
-- postfix name fun = Postfix (do{ reservedOp name; return fun })
--
buildExpressionParser :: (Monad p, Alternative p) => [[Operator p b]] -> p b -> p b