| License | BSD-3-Clause |
|---|---|
| Maintainer | Jamie Willis, Gigaparsec Maintainers |
| Stability | experimental |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Text.Gigaparsec.Expr.Infix
Description
This module contains the very useful chaining family of combinators, which are mostly used to parse operators and expressions of varying fixities.
It is a lower-level API than precedence.
Compared with the combinators in Text.Gigaparsec.Expr.Chain, these allow for more freedom in the type of the values and the operators.
Synopsis
- infixl1 :: (a -> b) -> Parsec a -> Parsec (b -> a -> b) -> Parsec b
- infixr1 :: (a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b
- infixn1 :: (a -> b) -> Parsec a -> Parsec (a -> a -> b) -> Parsec b
- prefix :: (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b
- postfix :: (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b
- infixl1 :: (a -> b) -> Parsec a -> Parsec (b -> a -> b) -> Parsec b
- infixr1 :: (a -> b) -> Parsec a -> Parsec (a -> b -> b) -> Parsec b
- infixn1 :: (a -> b) -> Parsec a -> Parsec (a -> a -> b) -> Parsec b
- prefix :: (a -> b) -> Parsec (b -> b) -> Parsec a -> Parsec b
- postfix :: (a -> b) -> Parsec a -> Parsec (b -> b) -> Parsec b
Binary Operator Chains
These combinators allow for the chaining together of values and binary operators in either left-, right- or non-associative application.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (b -> a -> b) |
|
| -> Parsec b | a parser that parses alternating |
This combinator handles left-associative parsing, and the application of, zero or more binary operators between one or more values.
First parse p, then parse op followed by a p repeatedly.
The results of the ps, x₁ through xₙ, are combined with the results of the ops,
f₁ through fₙ₋₁, with left-associative application:
fₙ₋₁ (fₙ₋₂ (..(f₁ x₁ x₂)..) xₙ₋₁) xₙ.
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Compared with chainl1,
this combinator allows the types of the operators to more accurately encode their associativity in their types.
However, chainl1, in which a and b must match,
allows for more flexibility to change the associativity.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (a -> b -> b) |
|
| -> Parsec b | a parser that parses alternating |
This combinator handles right-associative parsing, and the application of, zero or more binary operators between one or more values.
First parse p, then parse op followed by a p repeatedly.
The results of the ps, x₁ through xₙ, are combined with the results of the ops,
f₁ through fₙ, with right-associative application:
f₁ x₁ (f₂ x₂ (...(fₙ₋₁ xₙ₋₁ xₙ)...)).
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Compared with chainr1,
this combinator allows the types of the operators to more accurately encode their associativity in their types.
However, chainr1, in which a and b must match,
allows for more flexibility to change the associativity.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (a -> a -> b) |
|
| -> Parsec b | a parser that parses |
This combinator handles non-associative parsing, and the application of, zero or one binary operators between one or two values.
First parse p.
Then:
- If this not is followed by an
op, simply returnp. - Otherwise, parse this
opfollowed by a singlep. Then ensure that this is not followed by a furtherop, to enforce non-associativity. The results of theps,xandy, are combined with the result ofop,fwith the applicationf x y. This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
This combinator also fails if the second p is followed by another op.
Unary Operator Chains
These combinators allow for the chaining together, and application, of multiple prefix or postfix unary operators to a single value.
Arguments
| :: (a -> b) |
|
| -> Parsec (b -> b) |
|
| -> Parsec a |
|
| -> Parsec b | a parser that parses many |
This combinator handles right-assocative parsing, and application of, zero or more prefix unary operators to a single value.
First parse many repeated ops.
When there are no more ops left to parse, parse a single p.
The result of p, x, is applied first to wrap, and then to each of the results of the ops, f₁ through fₙ,
such that fₙ is applied first and f₁ last: f₁ (f₂ (..(fₙ (wrap x))..)).
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (b -> b) |
|
| -> Parsec b | a parser that parses many |
This combinator handles left-assocative parsing, and application of, zero or more postfix unary operators to a single value.
First parse a single p.
Then, parse many repeated ops.
The result of p, x, is applied first to wrap, and then to each of the results of the ops, f₁ through fₙ,
such that f₁ is applied first and fₙ last: fₙ( fₙ₋₁(..f₁ (wrap x)..)).
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Module Re-export
This should be removed.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (b -> a -> b) |
|
| -> Parsec b | a parser that parses alternating |
This combinator handles left-associative parsing, and the application of, zero or more binary operators between one or more values.
First parse p, then parse op followed by a p repeatedly.
The results of the ps, x₁ through xₙ, are combined with the results of the ops,
f₁ through fₙ₋₁, with left-associative application:
fₙ₋₁ (fₙ₋₂ (..(f₁ x₁ x₂)..) xₙ₋₁) xₙ.
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Compared with chainl1,
this combinator allows the types of the operators to more accurately encode their associativity in their types.
However, chainl1, in which a and b must match,
allows for more flexibility to change the associativity.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (a -> b -> b) |
|
| -> Parsec b | a parser that parses alternating |
This combinator handles right-associative parsing, and the application of, zero or more binary operators between one or more values.
First parse p, then parse op followed by a p repeatedly.
The results of the ps, x₁ through xₙ, are combined with the results of the ops,
f₁ through fₙ, with right-associative application:
f₁ x₁ (f₂ x₂ (...(fₙ₋₁ xₙ₋₁ xₙ)...)).
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Compared with chainr1,
this combinator allows the types of the operators to more accurately encode their associativity in their types.
However, chainr1, in which a and b must match,
allows for more flexibility to change the associativity.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (a -> a -> b) |
|
| -> Parsec b | a parser that parses |
This combinator handles non-associative parsing, and the application of, zero or one binary operators between one or two values.
First parse p.
Then:
- If this not is followed by an
op, simply returnp. - Otherwise, parse this
opfollowed by a singlep. Then ensure that this is not followed by a furtherop, to enforce non-associativity. The results of theps,xandy, are combined with the result ofop,fwith the applicationf x y. This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
This combinator also fails if the second p is followed by another op.
Arguments
| :: (a -> b) |
|
| -> Parsec (b -> b) |
|
| -> Parsec a |
|
| -> Parsec b | a parser that parses many |
This combinator handles right-assocative parsing, and application of, zero or more prefix unary operators to a single value.
First parse many repeated ops.
When there are no more ops left to parse, parse a single p.
The result of p, x, is applied first to wrap, and then to each of the results of the ops, f₁ through fₙ,
such that fₙ is applied first and f₁ last: f₁ (f₂ (..(fₙ (wrap x))..)).
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.
Arguments
| :: (a -> b) | a function converting the value type |
| -> Parsec a |
|
| -> Parsec (b -> b) |
|
| -> Parsec b | a parser that parses many |
This combinator handles left-assocative parsing, and application of, zero or more postfix unary operators to a single value.
First parse a single p.
Then, parse many repeated ops.
The result of p, x, is applied first to wrap, and then to each of the results of the ops, f₁ through fₙ,
such that f₁ is applied first and fₙ last: fₙ( fₙ₋₁(..f₁ (wrap x)..)).
This application is then returned as the result of the combinator.
If p or op fails having consumed input at any point, the whole combinator fails.