diff options
author | Martin Odersky <odersky@gmail.com> | 2007-09-16 18:01:02 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-09-16 18:01:02 +0000 |
commit | 7fe7bace8a7a55d888f4ebdce8d778ceb4384546 (patch) | |
tree | 3d1041a517a92f2a05f48ff80be116f316aadef1 /src | |
parent | 0b2f65aa6c6b3bb3e7628720893fb8116fdc8f71 (diff) | |
download | scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.tar.gz scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.tar.bz2 scala-7fe7bace8a7a55d888f4ebdce8d778ceb4384546.zip |
combinator1 parser changes + examples added
Diffstat (limited to 'src')
4 files changed, 7 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index ad2b0d1559..3cdcc226e8 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -1601,6 +1601,7 @@ A type's typeSymbol should never be inspected directly. maybeRewrap(underlying.instantiateTypeParams(formals, actuals)) override def baseType(clazz: Symbol) = maybeRewrap(underlying.baseType(clazz)) override def closure = underlying.closure map maybeRewrap + override def isHigherKinded = false override def skolemizeExistential(owner: Symbol, origin: AnyRef) = { def mkSkolem(tparam: Symbol): Symbol = { 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 } } } |