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

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.

Type parameters

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.

Value parameters

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.

Attributes

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('?').as(U), char('+').as(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.

Type parameters

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.

Value parameters

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.

Attributes

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('-').as(U), char('+').as(B))
scala> p.parse("-1+--2+3")
val res0 = Success(U(B(C('1'), U(U(B(C('2'), C('3')))))))
Source
mixed.scala