7

私はScalaを初めて使用し、その優れたコンビネーターパーサーライブラリーを使おうとしています。私はこのコードをコンパイルしようとしています:

import scala.util.parsing.combinator._
...
val r:Parsers#ParseResult[Node] = parser.parseAll(parser.suite,reader)
r match {
  case Success(r, n) => println(r)
  case Failure(msg, n) => println(msg)
  case Error(msg, n) => println(msg)
}
...

しかし、私はこれらのエラーを受け取り続けます:

TowelParser.scala:97: error: not found: value Success
  case Success(r, n) => println(r)
       ^
TowelParser.scala:98: error: not found: value Failure
  case Failure(msg, n) => println(msg)

TowelParser.scala:99: error: object Error is not a case class constructor, nor does it have an unapply/unapplySeq method
  case Error(msg, n) => println(msg)

私は次のようなさまざまなことを試しました:

case Parsers#Success(r, n) => println(r)

case Parsers.Success(r, n) => println(r)

import scala.util.parsing.combinator.Parsers.Success

しかし、これをコンパイルすることはできないようです。私が見逃している明らかな何かがあると確信していますが、私はしばらくそれをやっていて、グーグルはこれの良い例を持っていないようです。

ありがとう!

4

1 に答える 1

13

ParseResultインスタンスを含む、のフルパスを指定する必要がありParsersます。例えば:

import scala.util.parsing.combinator._

object parser extends RegexParsers { def digits = "\\d+".r ^^ (_.toInt) }

val res = parser.parseAll(parser.digits, "42")

res match {
  case parser.Success(r, n) => println(r)
  case parser.Failure(msg, n) => println(msg)
  case parser.Error(msg, n) => println(msg)
}

構文上の利便性を少し高めたい場合は、これらをインポートすることもできます。

import parser.{ Error, Failure, Success }

これで、元のバージョンが期待どおりに機能します。

于 2012-12-08T18:01:47.407 に答える