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

我是 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

但我似乎无法将其编译.我确信可能有一些明显的东西我不见了,但我已经有一段时间了,谷歌似乎没有任何好的例子.

谢谢!

解决方法

您需要指定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 }

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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...