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
- Self type
- mixed.type
Members list
Value members
Concrete methods
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 p
s, x1
through xn
, are combined
with the results of the bop
s, f1
through fn-1
, and the uop
s, 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
, andbop
, ending in ap
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
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 p
s, x1
through xn
, are combined
with the results of the bop
s, f1
through fn-1
, and the uop
s, 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
, andbop
, ending in ap
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