【问题标题】:Pattern matching on Parsers Success In ScalaScala中解析器成功的模式匹配
【发布时间】:2012-12-09 02:01:47
【问题描述】:

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

但我似乎无法编译它。我确定我可能缺少一些明显的东西,但我已经有一段时间了,谷歌似乎没有任何好的例子。

谢谢!

【问题讨论】:

    标签: parsing scala pattern-matching


    【解决方案1】:

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

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

    【讨论】:

    • 啊,我现在明白了。成功/失败/错误将成为解析器实例的成员。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2014-10-14
    • 2012-10-31
    • 1970-01-01
    • 2016-05-17
    • 2021-12-17
    相关资源
    最近更新 更多