| Copyright | © 2015 Megaparsec contributors © 2007 Paolo Martini © 1999–2001 Daan Leijen |
|---|---|
| License | BSD3 |
| Maintainer | Mark Karpov <markkarpov@opmbx.org> |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Text.Megaparsec.Expr
Description
A helper module to parse expressions. Builds a parser given a table of operators.
- data Operator m a
- makeExprParser :: MonadParsec s m t => m a -> [[Operator m a]] -> m a
Documentation
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.
makeExprParser :: MonadParsec s m t => m a -> [[Operator m a]] -> m a Source
makeExprParser term table builds an expression parser for terms
term with operators from table, taking the associativity and
precedence specified in table into account.
table is a list of [Operator s u m a] lists. The list is ordered in
descending precedence. All operators in one list have the same precedence
(but may have a different associativity).
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).
makeExprParser takes care of all the complexity involved in building an
expression parser. Here is an example of an expression parser that
handles prefix signs, postfix increment and basic arithmetic:
expr = makeExprParser term table <?> "expression"
term = parens expr <|> integer <?> "term"
table = [ [ prefix "-" negate
, prefix "+" id ]
, [ postfix "++" (+1) ]
, [ binary "*" (*)
, binary "/" div ]
, [ binary "+" (+)
, binary "-" (-) ] ]
binary name f = InfixL (reservedOp name >> return f)
prefix name f = Prefix (reservedOp name >> return f)
postfix name f = Postfix (reservedOp name >> return f)Please note that multi-character operators should use try in order to
be reported correctly in error messages.