Parsing Scala中解析器成功的模式匹配

Parsing Scala中解析器成功的模式匹配,parsing,scala,pattern-matching,Parsing,Scala,Pattern Matching,我是Scala的新手,一直在尝试使用其优秀的combinator解析器库。我一直在尝试编译以下代码: 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(

我是Scala的新手,一直在尝试使用其优秀的combinator解析器库。我一直在尝试编译以下代码:

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)

但我似乎无法编译这个。我确信我可能遗漏了一些明显的东西,但我已经做了一段时间了,谷歌似乎没有这方面的好例子


谢谢

您需要为
ParseResult
指定完整路径,其中包括您的
解析器
实例。例如:

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 }

现在,您的原始版本将按预期工作。

啊,我现在明白了。成功/失败/错误将是解析器实例的成员。谢谢
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 }