chain
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 more low-level API compared with precedence.
Attributes
- Since
-
2.2.0
- Source
- chain.scala
- Graph
-
- Supertypes
-
class Objecttrait Matchableclass Any
- Self type
-
chain.type
Members list
Grouped members
Unary Operator Chains
These chains allow for the chaining together and application of multiple prefix or postfix unary operators to a single value.
This combinator handles left-assocative parsing, and application of, zero or more postfix unary operators to a single value.
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 op
s. The result of p
, x
, is applied to each of the results of the op
s, f1
through fn
, such that f1
is applied first and fn
last: fn(fn-1(..f1(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.
Value parameters
- op
-
the postfix operator to repeatedly parser after
p
. - p
-
the single value to be parsed.
Attributes
- Returns
-
a parser that an initial
p
, then manyop
s, and applies all of the results left-associatively. - Since
-
2.2.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, string} scala> sealed trait Expr scala> case class Inc(x: Expr) extends Expr scala> case class Dec(x: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.postfix(digit.map(d => Num(d.asDigit)))(string("++").as(Inc) <|> string("--").as(Dec)) scala> expr.parse("1++----") val res0 = Success(Dec(Dec(Inc(Num(1))))) scala> expr.parse("1") val res1 = Success(Num(1)) scala> expr.parse("") val res2 = Failure(..)
- Source
- chain.scala
This combinator handles left-assocative parsing, and application of, one or more postfix unary operators to a single value.
This combinator handles left-assocative parsing, and application of, one or more postfix unary operators to a single value.
First parse a single p
. Then, parse at least one repeated op
s. The result of p
, x
, is applied to each of the results of the op
s, f1
through fn
, such that f1
is applied first and fn
last: fn(fn-1(..f1(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.
Value parameters
- op
-
the postfix operator to repeatedly parser after
p
. - p
-
the single value to be parsed.
Attributes
- Returns
-
a parser that an initial
p
, then someop
s, and applies all of the results left-associatively. - Since
-
3.0.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, string} scala> sealed trait Expr scala> case class Inc(x: Expr) extends Expr scala> case class Dec(x: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.postfix1(digit.map(d => Num(d.asDigit)), string("++").as(Inc) <|> string("--").as(Dec)) scala> expr.parse("1++----") val res0 = Success(Dec(Dec(Inc(Num(1))))) scala> expr.parse("1") val res1 = Failure(..) scala> expr.parse("") val res2 = Failure(..)
- Source
- chain.scala
This combinator handles right-assocative parsing, and application of, zero or more prefix unary operators to a single value.
This combinator handles right-assocative parsing, and application of, zero or more prefix unary operators to a single value.
First parse many repeated op
s. When there are no more op
s left to parse, parse a single p
. The result of p
, x
, is applied to each of the results of the op
s, f1
through fn
, such that fn
is applied first and f1
last: f1(f2(..fn(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.
Value parameters
- op
-
the prefix operator to repeatedly parse before
p
. - p
-
the single value to be parsed.
Attributes
- Returns
-
a parser that parses many
op
s, and a finalp
, and applies all of the results right-associatively. - Since
-
2.2.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, char} scala> sealed trait Expr scala> case class Negate(x: Expr) extends Expr scala> case class Id(x: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.prefix(digit.map(d => Num(d.asDigit))(char('-').as(Negate) <|> char('+').as(Id)) scala> expr.parse("--+1") val res0 = Success(Negate(Negate(Id(Num(1))))) scala> expr.parse("1") val res1 = Success(Num(1)) scala> expr.parse("") val res2 = Failure(..)
- Source
- chain.scala
This combinator handles right-assocative parsing, and application of, one or more prefix unary operators to a single value.
This combinator handles right-assocative parsing, and application of, one or more prefix unary operators to a single value.
First parse at least one repeated op
s. When there are no more op
s left to parse, parse a single p
. The result of p
, x
, is applied to each of the results of the op
s, f1
through fn
, such that fn
is applied first and f1
last: f1(f2(..fn(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.
Value parameters
- op
-
the prefix operator to repeatedly parse before
p
. - p
-
the single value to be parsed.
Attributes
- Returns
-
a parser that parses some
op
s, and a finalp
, and applies all of the results right-associatively. - Since
-
3.0.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, char} scala> sealed trait Expr scala> case class Negate(x: Expr) extends Expr scala> case class Id(x: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.prefix1(digit.map(d => Num(d.asDigit)))(char('-').as(Negate) <|> char('+').as(Id)) scala> expr.parse("--+1") val res0 = Success(Negate(Negate(Id(Num(1))))) scala> expr.parse("1") val res1 = Failure(..) scala> expr.parse("") val res2 = Failure(..)
- Source
- chain.scala
Binary Operator Chains
These chains allow for the chaining together of values and binary operators in either left- or right-associative application.
This combinator handles left-associative parsing, and application of, zero or more binary operators between zero or more values.
This combinator handles left-associative parsing, and application of, zero or more binary operators between zero or more values.
First parse p
, then parse op
followed by a p
repeatedly. The results of the p
s, x1
through xn
, are combined with the results of the op
s, f1
through fn-1
, with left-associative application: fn-1(fn-2(..f1(x1, x2).., xn-1), xn)
. 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. If no p
could be parsed, this combinator will return a default result x
.
Value parameters
- op
-
the operator between each value.
- p
-
the value to be parsed.
- x
-
the default value to return if no
p
s can be parsed.
Attributes
- Returns
-
a parser that parses alternating
p
andop
, ending in ap
and applies their results left-associatively or returnsx
if nop
was parsed. - See also
-
infix.left
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way. - Since
-
4.0.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, char} scala> sealed trait Expr scala> case class Add(x: Expr, y: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.left(digit.map(d => Num(d.asDigit)))(char('+').as(Add), Num(0)) scala> expr.parse("1+2+3+4") val res0 = Success(Add(Add(Add(Num(1), Num(2)), Num(3)), Num(4))) scala> expr.parse("") val res1 = Success(Num(0))
- Source
- chain.scala
This combinator handles left-associative parsing, and application of, zero or more binary operators between one or more values.
This combinator handles left-associative parsing, and 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 p
s, x1
through xn
, are combined with the results of the op
s, f1
through fn-1
, with left-associative application: fn-1(fn-2(..f1(x1, x2).., xn-1), xn)
. 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.
Value parameters
- op
-
the operator between each value.
- p
-
the value to be parsed.
Attributes
- Returns
-
a parser that parses alternating
p
andop
, ending in ap
and applies their results left-associatively. - See also
-
infix.left1
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way. - Since
-
4.0.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, char} scala> sealed trait Expr scala> case class Add(x: Expr, y: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.left1(digit.map(d => Num(d.asDigit)))(char('+').as(Add)) scala> expr.parse("1+2+3+4") val res0 = Success(Add(Add(Add(Num(1), Num(2)), Num(3)), Num(4))) scala> expr.parse("") val res1 = Failure(..)
- Source
- chain.scala
This combinator handles right-associative parsing, and application of, zero or more binary operators between zero or more values.
This combinator handles right-associative parsing, and application of, zero or more binary operators between zero or more values.
First parse p
, then parse op
followed by a p
repeatedly. The results of the p
s, x1
through xn
, are combined with the results of the op
s, f1
through fn-1
, with right-associative application: f1(x1, f2(x2, ..fn-1(xn-1, xn)..))
. 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. If no p
could be parsed, this combinator will return a default result x
.
Value parameters
- op
-
the operator between each value.
- p
-
the value to be parsed.
- x
-
the default value to return if no
p
s can be parsed.
Attributes
- Returns
-
a parser that parses alternating
p
andop
, ending in ap
and applies their results right-associatively or returnsx
if nop
was parsed. - See also
-
infix.right
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way. - Since
-
4.0.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, char} scala> sealed trait Expr scala> case class Add(x: Expr, y: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.right(digit.map(d => Num(d.asDigit)))(char('+').as(Add), Num(0)) scala> expr.parse("1+2+3+4") val res0 = Success(Add(Num(1), Add(Num(2), Add(Num(3), Num(4))))) scala> expr.parse("") val res1 = Success(Num(0))
- Source
- chain.scala
This combinator handles right-associative parsing, and application of, zero or more binary operators between one or more values.
This combinator handles right-associative parsing, and 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 p
s, x1
through xn
, are combined with the results of the op
s, f1
through fn-1
, with right-associative application: f1(x1, f2(x2, ..fn-1(xn-1, xn)..))
. 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.
Value parameters
- op
-
the operator between each value.
- p
-
the value to be parsed.
Attributes
- Returns
-
a parser that parses alternating
p
andop
, ending in ap
and applies their results right-associatively. - See also
-
infix.right1
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way. - Since
-
4.0.0
- Example
-
scala> import parsley.expr.chain scala> import parsley.character.{digit, char} scala> sealed trait Expr scala> case class Add(x: Expr, y: Expr) extends Expr scala> case class Num(x: Int) extends Expr scala> val expr = chain.right1(digit.map(d => Num(d.asDigit)))(char('+').as(Add)) scala> expr.parse("1+2+3+4") val res0 = Success(Add(Num(1), Add(Num(2), Add(Num(3), Num(4))))) scala> expr.parse("") val res1 = Failure(..)
- Source
- chain.scala