object 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.
- Source
- chain.scala
- Since
2.2.0
- Grouped
- Alphabetic
- By Inheritance
- chain
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def left[A](p: Parsley[A], op: => Parsley[(A, A) => A], x: A): Parsley[A]
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 parseop
followed by ap
repeatedly. The results of thep
s,x1
throughxn
, are combined with the results of theop
s,f1
throughfn-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. Ifp
orop
fails having consumed input at any point, the whole combinator fails. If nop
could be parsed, this combinator will return a default resultx
.- p
the value to be parsed.
- op
the operator between each value.
- x
the default value to return if no
p
s can be parsed.- returns
a parser that parses alternating
p
andop
, ending in ap
and applies their results left-associatively or returnsx
if nop
was parsed.
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('+') #> 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))
- Since
4.0.0
- See also
infix.left
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way.
Example: - def left1[A](p: Parsley[A], op: => Parsley[(A, A) => A]): Parsley[A]
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 parseop
followed by ap
repeatedly. The results of thep
s,x1
throughxn
, are combined with the results of theop
s,f1
throughfn-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. Ifp
orop
fails having consumed input at any point, the whole combinator fails.- p
the value to be parsed.
- op
the operator between each value.
- returns
a parser that parses alternating
p
andop
, ending in ap
and applies their results left-associatively.
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('+') #> 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(..)
- Since
4.0.0
- See also
infix.left1
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way.
Example: - final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- def postfix[A](p: Parsley[A], op: => Parsley[(A) => A]): Parsley[A]
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 repeatedop
s. The result ofp
,x
, is applied to each of the results of theop
s,f1
throughfn
, such thatf1
is applied first andfn
last:fn(fn-1(..f1(x)..))
. This application is then returned as the result of the combinator. Ifp
orop
fails having consumed input at any point, the whole combinator fails.- p
the single value to be parsed.
- op
the postfix operator to repeatedly parser after
p
.- returns
a parser that an initial
p
, then manyop
s, and applies all of the results left-associatively.
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("++") #> Inc <|> string("--") #> 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(..)
- Since
2.2.0
Example: - def postfix1[A, B <: A](p: Parsley[A], op: => Parsley[(A) => B]): Parsley[B]
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 repeatedop
s. The result ofp
,x
, is applied to each of the results of theop
s,f1
throughfn
, such thatf1
is applied first andfn
last:fn(fn-1(..f1(x)..))
. This application is then returned as the result of the combinator. Ifp
orop
fails having consumed input at any point, the whole combinator fails.- p
the single value to be parsed.
- op
the postfix operator to repeatedly parser after
p
.- returns
a parser that an initial
p
, then someop
s, and applies all of the results left-associatively.
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("++") #> Inc <|> string("--") #> 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(..)
- Since
3.0.0
Example: - def prefix[A](op: Parsley[(A) => A], p: Parsley[A]): Parsley[A]
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 moreop
s left to parse, parse a singlep
. The result ofp
,x
, is applied to each of the results of theop
s,f1
throughfn
, such thatfn
is applied first andf1
last:f1(f2(..fn(x)..))
. This application is then returned as the result of the combinator. Ifp
orop
fails having consumed input at any point, the whole combinator fails.- op
the prefix operator to repeatedly parse before
p
.- p
the single value to be parsed.
- returns
a parser that parses many
op
s, and a finalp
, and applies all of the results right-associatively.
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(char('-') #> Negate <|> char('+') #> Id, digit.map(d => Num(d.asDigit))) 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(..)
- Since
2.2.0
Example: - def prefix1[A, B <: A](op: Parsley[(A) => B], p: => Parsley[A]): Parsley[B]
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 moreop
s left to parse, parse a singlep
. The result ofp
,x
, is applied to each of the results of theop
s,f1
throughfn
, such thatfn
is applied first andf1
last:f1(f2(..fn(x)..))
. This application is then returned as the result of the combinator. Ifp
orop
fails having consumed input at any point, the whole combinator fails.- op
the prefix operator to repeatedly parse before
p
.- p
the single value to be parsed.
- returns
a parser that parses some
op
s, and a finalp
, and applies all of the results right-associatively.
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(char('-') #> Negate <|> char('+') #> Id, digit.map(d => Num(d.asDigit))) 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(..)
- Since
3.0.0
Example: - def right[A](p: Parsley[A], op: => Parsley[(A, A) => A], x: A): Parsley[A]
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 parseop
followed by ap
repeatedly. The results of thep
s,x1
throughxn
, are combined with the results of theop
s,f1
throughfn-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. Ifp
orop
fails having consumed input at any point, the whole combinator fails. If nop
could be parsed, this combinator will return a default resultx
.- p
the value to be parsed.
- op
the operator between each value.
- x
the default value to return if no
p
s can be parsed.- returns
a parser that parses alternating
p
andop
, ending in ap
and applies their results right-associatively or returnsx
if nop
was parsed.
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('+') #> 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))
- Since
4.0.0
- See also
infix.right
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way.
Example: - def right1[A](p: Parsley[A], op: => Parsley[(A, A) => A]): Parsley[A]
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 parseop
followed by ap
repeatedly. The results of thep
s,x1
throughxn
, are combined with the results of theop
s,f1
throughfn-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. Ifp
orop
fails having consumed input at any point, the whole combinator fails.- p
the value to be parsed.
- op
the operator between each value.
- returns
a parser that parses alternating
p
andop
, ending in ap
and applies their results right-associatively.
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('+') #> 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(..)
- Since
4.0.0
- See also
infix.right1
for a version where the types can vary, ensuring that the associativity is enforced in a type-safe way.
Example: - final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
Binary Operator Chains
These chains allow for the chaining together of values and binary operators in either left- or right-associative application.
Unary Operator Chains
These chains allow for the chaining together and application of multiple prefix or postfix unary operators to a single value.