diff options
author | Aleksandar Prokopec <axel22@gmail.com> | 2012-05-04 17:50:39 +0200 |
---|---|---|
committer | Aleksandar Prokopec <axel22@gmail.com> | 2012-05-04 18:51:34 +0200 |
commit | 37c157c91f9240b562faa437dbda18bcb435e0ee (patch) | |
tree | 0066203b1d8ba729d5de27eb324ea4a922148cee | |
parent | f146d5826fc335ee1ca9c285d69086a7475cb71e (diff) | |
download | scala-37c157c91f9240b562faa437dbda18bcb435e0ee.tar.gz scala-37c157c91f9240b562faa437dbda18bcb435e0ee.tar.bz2 scala-37c157c91f9240b562faa437dbda18bcb435e0ee.zip |
Fixes SI-5514.
The acceptIf and acceptMatch parsers now check for end of input.
Review by moors.
-rw-r--r-- | src/library/scala/util/parsing/combinator/Parsers.scala | 6 | ||||
-rw-r--r-- | test/files/run/t5514.check | 19 | ||||
-rw-r--r-- | test/files/run/t5514.scala (renamed from test/pending/run/t5514.scala) | 22 |
3 files changed, 34 insertions, 13 deletions
diff --git a/src/library/scala/util/parsing/combinator/Parsers.scala b/src/library/scala/util/parsing/combinator/Parsers.scala index e5458f89af..17e032e7ab 100644 --- a/src/library/scala/util/parsing/combinator/Parsers.scala +++ b/src/library/scala/util/parsing/combinator/Parsers.scala @@ -596,7 +596,8 @@ trait Parsers { * @return A parser for elements satisfying p(e). */ def acceptIf(p: Elem => Boolean)(err: Elem => String): Parser[Elem] = Parser { in => - if (p(in.first)) Success(in.first, in.rest) + if (in.atEnd) Failure("end of input", in) + else if (p(in.first)) Success(in.first, in.rest) else Failure(err(in.first), in) } @@ -614,7 +615,8 @@ trait Parsers { * applying `f` to it to produce the result. */ def acceptMatch[U](expected: String, f: PartialFunction[Elem, U]): Parser[U] = Parser{ in => - if (f.isDefinedAt(in.first)) Success(f(in.first), in.rest) + if (in.atEnd) Failure("end of input", in) + else if (f.isDefinedAt(in.first)) Success(f(in.first), in.rest) else Failure(expected+" expected", in) } diff --git a/test/files/run/t5514.check b/test/files/run/t5514.check new file mode 100644 index 0000000000..c68f7c9029 --- /dev/null +++ b/test/files/run/t5514.check @@ -0,0 +1,19 @@ +constructed reader: 10 +constructed reader: 9 +constructed reader: 8 +constructed reader: 7 +constructed reader: 6 +constructed reader: 5 +constructed reader: 4 +constructed reader: 3 +constructed reader: 2 +constructed reader: 1 +constructed reader: 0 +[0.0] parsed: List(s10, s9, s8, s7, s6, s5, s4, s3, s2, s1) +constructed reader: 10 +constructed reader: 9 +constructed reader: 8 +constructed reader: 7 +constructed reader: 6 +constructed reader: 5 +[0.0] parsed: List(s10, s9, s8, s7, s6)
\ No newline at end of file diff --git a/test/pending/run/t5514.scala b/test/files/run/t5514.scala index eacad21cd8..efd5ba6cb9 100644 --- a/test/pending/run/t5514.scala +++ b/test/files/run/t5514.scala @@ -8,28 +8,28 @@ import scala.util.parsing.input.Position -object DemoApp extends App { - val parsers = new DemoParsers - val reader = new DemoReader(10) - val result = parsers.startsWith("s").*(reader) - Console println result -} - - class DemoReader(n: Int) extends Reader[String] { def atEnd = n == 0 - def first = "s" + n + def first = if (n >= 0) "s" + n else throw new IllegalArgumentException("No more input.") def rest = new DemoReader(n - 1) def pos = new Position { def line = 0 def column = 0 def lineContents = first } - println("reader: " + n) + println("constructed reader: " + n) } -class DemoParsers extends Parsers { +object Test extends App with Parsers { type Elem = String def startsWith(prefix: String) = acceptIf(_ startsWith prefix)("Error: " + _) + + val resrep = startsWith("s").*(new DemoReader(10)) + Console println resrep + + val resrep5 = repN(5, startsWith("s"))(new DemoReader(10)) + Console println resrep5 } + + |