微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析 – 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 }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐