diff options
author | Paul Phillips <paulp@improving.org> | 2012-05-05 10:36:51 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-05-05 10:36:51 -0700 |
commit | 1a4faa92faaf495f75a6dd2c58376f6bb3fbf44c (patch) | |
tree | a10aca28d70ce0c02a59f13696820150a6dc65bf /src | |
parent | dd8f53d510ad820d5b34b20f2846c8da5d4942a1 (diff) | |
parent | dce6b34c38a6d774961ca6f9fd50b11300ecddd6 (diff) | |
download | scala-1a4faa92faaf495f75a6dd2c58376f6bb3fbf44c.tar.gz scala-1a4faa92faaf495f75a6dd2c58376f6bb3fbf44c.tar.bz2 scala-1a4faa92faaf495f75a6dd2c58376f6bb3fbf44c.zip |
Merge commit 'refs/pull/124/head' into develop
Conflicts:
src/library/scala/util/parsing/combinator/Parsers.scala
Diffstat (limited to 'src')
-rw-r--r-- | src/library/scala/util/parsing/combinator/Parsers.scala | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/library/scala/util/parsing/combinator/Parsers.scala b/src/library/scala/util/parsing/combinator/Parsers.scala index 17e032e7ab..66e0a496d8 100644 --- a/src/library/scala/util/parsing/combinator/Parsers.scala +++ b/src/library/scala/util/parsing/combinator/Parsers.scala @@ -13,6 +13,7 @@ import scala.collection.mutable.ListBuffer import scala.annotation.tailrec import annotation.migration import language.implicitConversions +import scala.util.DynamicVariable // TODO: better error handling (labelling like parsec's <?>) @@ -154,13 +155,14 @@ trait Parsers { val successful = true } - var lastNoSuccess: NoSuccess = null + private lazy val lastNoSuccess = new DynamicVariable[Option[NoSuccess]](None) /** A common super-class for unsuccessful parse results. */ 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 val successful = false - if (!(lastNoSuccess != null && next.pos < lastNoSuccess.next.pos)) - lastNoSuccess = this + + if (lastNoSuccess.value map { v => !(next.pos < v.next.pos) } getOrElse true) + lastNoSuccess.value = Some(this) def map[U](f: Nothing => U) = this def mapPartial[U](f: PartialFunction[Nothing, U], error: Nothing => String): ParseResult[U] = this @@ -879,16 +881,15 @@ trait Parsers { * if `p` consumed all the input. */ def phrase[T](p: Parser[T]) = new Parser[T] { - lastNoSuccess = null - def apply(in: Input) = p(in) match { + def apply(in: Input) = lastNoSuccess.withValue(None) { + p(in) match { case s @ Success(out, in1) => if (in1.atEnd) s - else if (lastNoSuccess == null || lastNoSuccess.next.pos < in1.pos) - Failure("end of input expected", in1) else - lastNoSuccess - case _ => lastNoSuccess + lastNoSuccess.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1) + case ns => lastNoSuccess.value.getOrElse(ns) + } } } |