-- 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