summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-09-16 18:01:02 +0000
committerMartin Odersky <odersky@gmail.com>2007-09-16 18:01:02 +0000
commit7fe7bace8a7a55d888f4ebdce8d778ceb4384546 (patch)
tree3d1041a517a92f2a05f48ff80be116f316aadef1 /src/library
parent0b2f65aa6c6b3bb3e7628720893fb8116fdc8f71 (diff)
downloadscala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.tar.gz
scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.tar.bz2
scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.zip
combinator1 parser changes + examples added
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/util/parsing/combinator1/$tilde.scala18
-rw-r--r--src/library/scala/util/parsing/combinator1/Parsers.scala4
-rw-r--r--src/library/scala/util/parsing/combinator1/syntactical/TokenParsers.scala8
3 files changed, 6 insertions, 24 deletions
diff --git a/src/library/scala/util/parsing/combinator1/$tilde.scala b/src/library/scala/util/parsing/combinator1/$tilde.scala
deleted file mode 100644
index 25694c1488..0000000000
--- a/src/library/scala/util/parsing/combinator1/$tilde.scala
+++ /dev/null
@@ -1,18 +0,0 @@
-package scala.util.parsing.combinator1
-
-// p ~ q ~ r ^^ {case a ~ b ~ c => }
-case class ~[+a, +b](_1: a, _2: b) {
- override def toString = "("+ _1 +" ~ "+ _2 +")"
-}
-
-// shortcut for scala.util.parsing.combinator.~(_, _) -- just ~(_, _) resolves to unary_~
-object mkTilde { def apply[a, b](_1: a, _2: b) = scala.util.parsing.combinator.~(_1, _2) }
-
-
- //def flatten[t, s <: (~[t, s] \/ t)](p: ~[t, s]): List[t] = p match {
- // case hd ~ tl => hd :: flatten(tl)
- // case a ~ b => List(a, b)
- //}
- //def flatten[t, s <: ~[t, s]](p: ~[t, s]): List[t] = p._1 :: flatten(p)
- //def flatten[t](p: ~[t, t]): List[t] = List(p._1, p._2)
-
diff --git a/src/library/scala/util/parsing/combinator1/Parsers.scala b/src/library/scala/util/parsing/combinator1/Parsers.scala
index 872ec97009..cef539cee6 100644
--- a/src/library/scala/util/parsing/combinator1/Parsers.scala
+++ b/src/library/scala/util/parsing/combinator1/Parsers.scala
@@ -128,10 +128,14 @@ trait Parsers {
val successful = true
}
+ var lastNoSuccess: NoSuccess = null
+
/** 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
def map[U](f: Nothing => U) = this
def mapPartial[U](f: PartialFunction[Nothing, U], error: Nothing => String): ParseResult[U] = this
diff --git a/src/library/scala/util/parsing/combinator1/syntactical/TokenParsers.scala b/src/library/scala/util/parsing/combinator1/syntactical/TokenParsers.scala
index d4f8a9dfc8..5cb66c5941 100644
--- a/src/library/scala/util/parsing/combinator1/syntactical/TokenParsers.scala
+++ b/src/library/scala/util/parsing/combinator1/syntactical/TokenParsers.scala
@@ -48,15 +48,11 @@ trait TokenParsers extends Parsers {
* if <code>p</code> consumed all the input.
*/
def phrase[t](p: Parser[t]) = new Parser[t] {
+ lastNoSuccess = null
def apply(in: Input) = p(in) match {
case s @ Success(out, in1) if in1.atEnd => s
case s @ Success(out, in1) => Failure("end of input expected", in1)
- case f @ Failure(_, in1) => in1.first match {
- case lexical.ErrorToken(msg) => Failure(msg, in1)
- case lexical.EOF => Failure("unexpected end of input", in1)
- case t => Failure("unexpected token "+t, in1)
- }
- case f => f
+ case f : NoSuccess => lastNoSuccess
}
}
}