Skip to content

Commit d45ff64

Browse files
author
Amal Elshihaby
committed
Fix bug in repeatedly parsing scala#34
1 parent 45ed52f commit d45ff64

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

src/main/scala/scala/util/parsing/combinator/Parsers.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ trait Parsers {
161161
/** A common super-class for unsuccessful parse results. */
162162
sealed abstract class NoSuccess(val msg: String, override val next: Input) extends ParseResult[Nothing] { // when we don't care about the difference between Failure and Error
163163
val successful = false
164-
165164
if (lastNoSuccessVar.value forall (v => !(next.pos < v.next.pos)))
166165
lastNoSuccessVar.value = Some(this)
167166

@@ -438,7 +437,7 @@ trait Parsers {
438437
*
439438
* @return rep(this)
440439
*/
441-
def * = rep(this)
440+
def * = rep1(this)
442441

443442
/** Returns a parser that repeatedly parses what this parser parses,
444443
* interleaved with the `sep` parser. The `sep` parser specifies how
@@ -879,13 +878,18 @@ trait Parsers {
879878
*/
880879
def phrase[T](p: Parser[T]) = new Parser[T] {
881880
def apply(in: Input) = lastNoSuccessVar.withValue(None) {
881+
println("^^^^^^^^^^^^^^^^^^^")
882+
println(p)
882883
p(in) match {
883884
case s @ Success(out, in1) =>
885+
println(s.get)
884886
if (in1.atEnd)
885887
s
886-
else
887-
lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1)
888-
case ns => lastNoSuccessVar.value.getOrElse(ns)
888+
else {
889+
lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1)
890+
}
891+
case ns =>
892+
lastNoSuccessVar.value.getOrElse(ns)
889893
}
890894
}
891895
}

src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,28 @@ class JavaTokenParsersTest {
5555
parseFailure("with space", 6)
5656
}
5757

58+
@Test
59+
def repeatedlyParsesTest: Unit = {
60+
object TestTokenParser extends JavaTokenParsers
61+
import TestTokenParser._
62+
val p = ident ~ "(?i)AND".r.*
63+
64+
val parseResult = parseAll(p, "start start")
65+
parseResult match {
66+
case e @ Failure(message, next) =>
67+
assertEquals(next.pos.column, 7)
68+
assert(message.endsWith("string matching regex `(?i)AND' expected but `s' found"))
69+
case _ => sys.error(parseResult.toString)
70+
}
71+
72+
val parseResult2 = parseAll(p, "start AND AND")
73+
parseResult2 match {
74+
case Success(r, _) =>
75+
assertEquals("start", r._1)
76+
assertEquals("AND AND", r._2.mkString(" "))
77+
case _ => sys.error(parseResult.toString)
78+
}
79+
}
80+
81+
5882
}

0 commit comments

Comments
 (0)