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.