Skip to content

Commit 35b8e37

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

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ trait Parsers {
884884
if (in1.atEnd)
885885
s
886886
else
887-
lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1)
887+
lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1)
888888
case ns => lastNoSuccessVar.value.getOrElse(ns)
889889
}
890890
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ trait RegexParsers extends Parsers {
154154
override def err(msg: String) = ws(super.err(msg))
155155

156156
override def phrase[T](p: Parser[T]): Parser[T] =
157-
super.phrase(p <~ opt("""\z""".r))
157+
super.phrase(p)
158158

159159
/** Parse some prefix of reader `in` with parser `p`. */
160160
def parse[T](p: Parser[T], in: Reader[Char]): ParseResult[T] =

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,39 @@ class JavaTokenParsersTest {
5252
parseFailure("with-s", 5)
5353
// we♥scala
5454
parseFailure("we\u2665scala", 3)
55-
parseFailure("with space", 6)
55+
parseFailure("with space", 5)
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")
65+
parseResult match {
66+
case Success(r, _) =>
67+
assertEquals("start", r._1)
68+
assertEquals(0, r._2.size)
69+
case _ => sys.error(parseResult.toString)
70+
}
71+
72+
val parseResult1 = parseAll(p, "start start")
73+
parseResult1 match {
74+
case e @ Failure(message, next) =>
75+
assertEquals(next.pos.column, 7)
76+
assert(message.endsWith("string matching regex `(?i)AND' expected but `s' found"))
77+
case _ => sys.error(parseResult1.toString)
78+
}
79+
80+
val parseResult2 = parseAll(p, "start AND AND")
81+
parseResult2 match {
82+
case Success(r, _) =>
83+
assertEquals("start", r._1)
84+
assertEquals("AND AND", r._2.mkString(" "))
85+
case _ => sys.error(parseResult2.toString)
86+
}
87+
}
88+
89+
5890
}

0 commit comments

Comments
 (0)