diff --git a/src/main/scala/scala/util/parsing/combinator/Parsers.scala b/src/main/scala/scala/util/parsing/combinator/Parsers.scala index 16754646..f6011d3a 100644 --- a/src/main/scala/scala/util/parsing/combinator/Parsers.scala +++ b/src/main/scala/scala/util/parsing/combinator/Parsers.scala @@ -884,7 +884,7 @@ trait Parsers { if (in1.atEnd) s else - lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1) + lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1) case ns => lastNoSuccessVar.value.getOrElse(ns) } } diff --git a/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala b/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala index e05d71e2..0ebf1aa1 100644 --- a/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala +++ b/src/main/scala/scala/util/parsing/combinator/RegexParsers.scala @@ -154,7 +154,7 @@ trait RegexParsers extends Parsers { override def err(msg: String) = ws(super.err(msg)) override def phrase[T](p: Parser[T]): Parser[T] = - super.phrase(p <~ opt("""\z""".r)) + super.phrase(p) /** Parse some prefix of reader `in` with parser `p`. */ def parse[T](p: Parser[T], in: Reader[Char]): ParseResult[T] = diff --git a/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala b/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala index 5851a655..018f76f4 100644 --- a/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala +++ b/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala @@ -52,7 +52,39 @@ class JavaTokenParsersTest { parseFailure("with-s", 5) // we♥scala parseFailure("we\u2665scala", 3) - parseFailure("with space", 6) + parseFailure("with space", 5) } + @Test + def repeatedlyParsesTest: Unit = { + object TestTokenParser extends JavaTokenParsers + import TestTokenParser._ + val p = ident ~ "(?i)AND".r.* + + val parseResult = parseAll(p, "start") + parseResult match { + case Success(r, _) => + assertEquals("start", r._1) + assertEquals(0, r._2.size) + case _ => sys.error(parseResult.toString) + } + + val parseResult1 = parseAll(p, "start start") + parseResult1 match { + case e @ Failure(message, next) => + assertEquals(next.pos.column, 7) + assert(message.endsWith("string matching regex `(?i)AND' expected but `s' found")) + case _ => sys.error(parseResult1.toString) + } + + val parseResult2 = parseAll(p, "start AND AND") + parseResult2 match { + case Success(r, _) => + assertEquals("start", r._1) + assertEquals("AND AND", r._2.mkString(" ")) + case _ => sys.error(parseResult2.toString) + } + } + + }