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.

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')))))
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')))))))