Skip to content

Commit ee47ca8

Browse files
committed
BROKEN: non-associative operators are not yet working
1 parent b22ae5e commit ee47ca8

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

Diff for: shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala

+6-2
Original file line numberDiff line numberDiff line change
@@ -1107,8 +1107,12 @@ trait Parsers {
11071107
private def expandLeft(lhs: Exp, input: Reader[Elem], minLevel: Int): Expansion = {
11081108
binop(input) match {
11091109
case Success(op, binInput) => {
1110-
val prec = precedence(op);
1111-
if (prec >= minLevel) {
1110+
val (prec, assoc) = opData(op);
1111+
val canExpand = assoc match {
1112+
case Associativity.Non => prec > minLevel
1113+
case _ => prec >= minLevel
1114+
};
1115+
if (canExpand) {
11121116
primary(binInput) match {
11131117
case Success(rhs, next) => {
11141118
expandRight(rhs, next, prec) match {

Diff for: shared/src/test/scala/scala/util/parsing/combinator/PrecedenceParserTest.scala

+21-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ class PrecedenceParsersTest {
2323
object Divide extends Op {
2424
override def toString = "/"
2525
}
26+
object LT extends Op {
27+
override def toString = "<"
28+
}
29+
object GT extends Op {
30+
override def toString = ">"
31+
}
2632
object Equals extends Op {
2733
override def toString = "="
2834
}
@@ -39,9 +45,18 @@ class PrecedenceParsersTest {
3945
val prec = List(
4046
(Associativity.Left, List(Mult, Divide)),
4147
(Associativity.Left, List(Plus, Minus)),
48+
(Associativity.Non, List(LT, GT)),
4249
(Associativity.Right, List(Equals)))
4350
def integer: Parser[Leaf] = "[0-9]+".r ^^ { (s: String) => Leaf(s.toInt) }
44-
def binop: Parser[Op] = "+" ^^^ Plus | "-" ^^^ Minus | "*" ^^^ Mult | "/" ^^^ Divide | "=" ^^^ Equals
51+
def binop: Parser[Op] = {
52+
"+" ^^^ Plus |
53+
"-" ^^^ Minus |
54+
"*" ^^^ Mult |
55+
"/" ^^^ Divide |
56+
"<" ^^^ LT |
57+
">" ^^^ GT |
58+
"=" ^^^ Equals
59+
}
4560
def token: Parser[Token] = integer | binop
4661
def expression = new PrecedenceParser(integer, binop, prec, Binop.apply)
4762
}
@@ -73,6 +88,11 @@ class PrecedenceParsersTest {
7388
}
7489
}
7590

91+
@Test
92+
def testNonAssoc(): Unit = {
93+
testExp(Binop(Leaf(1), LT, Leaf(2)), "1 < 2 < 3", List[Token](LT, Leaf(3)));
94+
}
95+
7696
@Test
7797
def testGracefulEnd(): Unit = {
7898
testExp(Leaf(4), "4 +", List[Token](Plus));

0 commit comments

Comments
 (0)