mixed

parsley.expr.mixed$
object mixed

This module contains specialist combinators for mixing unary and binary operators on the same level. This is only sensible when mixing infix-left and postfix or infix-right and prefix.

Attributes

Since:

4.0.0

Note:

the behaviour of the enclosed combinators may be counter intuitive: they should not be used unless you know what you are doing.

Source:
mixed.scala
Graph
Supertypes
class Object
trait Matchable
class Any
Self type
mixed.type

Members list

Concise view

Value members

Concrete methods

def left1[A, B, C >: B](p: Parsley[A], uop: => Parsley[C => C], bop: => Parsley[(C, A) => B])(implicit wrap: A => C): Parsley[C]

This combinator handles left-associative parsing, and application of, zero or more binary operators and postfix unary operators between/before one or more values.

This combinator handles left-associative parsing, and application of, zero or more binary operators and postfix unary operators between/before one or more values.

First parse p, then parse either a uop or an op followed by a p, repeatedly. The results of the ps, x1 through xn, are combined with the results of the bops, f1 through fn-1, and the uops, g1,1 through gm,i, with left-associative application: gm,i(gm,i-1(..gm,1(fn-1(..f1(g1,j(..g1,1(x1)..)), .. . This application is then returned as the result of the combinator. If p, uop, or bop fails having consumed input at any point, the whole combinator fails.

Attributes

A

the type of the values.

B

the type returned by the operator, which must be a subtype of the result type C.

C

the result type of the chain, which also fits into the recursive application site of the operators.

bop

the operator between each value.

p

the value to be parsed.

uop

the operator before each binary application.

wrap

a function that can convert the value type into the result type, this is provided automatically when A <:< C.

Returns:

a parser that parses alternating p, uop, and bop, ending in a p and applies their results left-associatively.

Since:

4.0.0

Note:

if you know this is what you are looking for, you have found it: otherwise, this is not what you are looking for.

Example:

scala> import parsley.expr.mixed, parsley.character.{digit, char}
scala> sealed trait Expr
scala> case class B(l: Expr, r: C) extends Expr
scala> case class U(c: Expr) extends Expr
scala> case class C(x: Char) extends Expr
scala> val p = mixed.left1(digit.map(Constant), char('?') #> U, char('+') #> B)
scala> p.parse("1?+2+3??")
val res0 = Success(U(U(B(B(U(C('1')), C('2')), C('3')))))
Source:
mixed.scala
def right1[A, B, C >: B](p: Parsley[A], uop: Parsley[C => C], bop: => Parsley[(A, C) => B])(implicit wrap: A => C): Parsley[C]

This combinator handles right-associative parsing, and application of, zero or more binary operators and prefix unary operators between/before one or more values.

This combinator handles right-associative parsing, and application of, zero or more binary operators and prefix unary operators between/before one or more values.

First parse p, then parse either a uop or an op followed by a p, repeatedly. The results of the ps, x1 through xn, are combined with the results of the bops, f1 through fn-1, and the uops, g1,1 through gm,i, with right-associative application: g1,1(g1,2(..g1,i(f1(x1, g2,1(..g2,j(f2(x2,.. . This application is then returned as the result of the combinator. If p, uop, or bop fails having consumed input at any point, the whole combinator fails.

Attributes

A

the type of the values.

B

the type returned by the operator, which must be a subtype of the result type C.

C

the result type of the chain, which also fits into the recursive application site of the operators.

bop

the operator between each value.

p

the value to be parsed.

uop

the operator before each binary application.

wrap

a function that can convert the value type into the result type, this is provided automatically when A <:< C.

Returns:

a parser that parses alternating p, uop, and bop, ending in a p and applies their results right-associatively.

Since:

4.0.0

Note:

if you know this is what you are looking for, you have found it: otherwise, this is not what you are looking for.

Example:

scala> import parsley.expr.mixed, parsley.character.{digit, char}
scala> sealed trait Expr
scala> case class B(l: C, r: Expr) extends Expr
scala> case class U(c: Expr) extends Expr
scala> case class C(x: Char) extends Expr
scala> val p = mixed.right1(digit.map(C), char('-') #> U, char('+') #> B)
scala> p.parse("-1+--2+3")
val res0 = Success(U(B(C('1'), U(U(B(C('2'), C('3')))))))
Source:
mixed.scala