【问题标题】:what is wrong: "value Parsers is not a member of package scala.util.parsing.combinator"?出了什么问题:“值解析器不是包 scala.util.parsing.combinator 的成员”?
【发布时间】:2010-03-27 13:15:01
【问题描述】:

我收到了上述奇怪的错误消息,我不明白“值解析器不是包 scala.util.parsing.combinator 的成员”。

我正在尝试通过逐步编写 C 解析器来学习解析器组合器。我从令牌开始,所以我有课程:

import util.parsing.combinator.JavaTokenParsers
object CeeParser extends JavaTokenParsers {
    def token: Parser[CeeExpr] = ident ^^ (x => Token(x))
}

abstract class CeeExpr 
case class Token(name: String) extends CeeExpr

这是我能做到的最简单的。

下面的代码可以正常工作,但是如果我取消注释注释行,我会收到上面给出的错误消息:

object Play {
  def main(args: Array[String]) {
    //val parser: _root_.scala.util.parsing.combinator.Parsers.Parser[CeeExpr] CeeParser.token
    val x = CeeParser.token
    print(x)
  }
}

如果我的设置有问题,我将通过用于 intellij 的 scala-plugin 使用 scala 2.7.6。任何人都可以对此有所了解吗?消息错误,Parsers 是scala.util.parsing.combinator 的成员。

--- 跟进

这个人http://www.scala-lang.org/node/5475好像也有同样的问题,但是我不明白他给出的答案。谁能解释一下?

【问题讨论】:

    标签: scala parser-combinators


    【解决方案1】:

    问题在于Parser 是Parsers 的子类,因此引用它的正确方法是从Parser 的实例。也就是说,CeeParser.Parser 不同于任何其他 x.Parser。

    引用CeeParser.token的类型的正确方法是CeeParser.Parser。

    【讨论】:

      【解决方案2】:

      问题在于 Parsers 不是包或类,它是一个特征,所以它的成员不能被导入。您需要从扩展 trait 的特定类导入。

      在这种情况下,特定的类是 CeeParser,所以val 的类型应该是 CeeParser.Parser[CeeExpr]:

      val parser : CeeParser.Parser[CeeExpr]
      

      【讨论】:

      • 也可以使用语法scala.util.parsing.combinator.Parsers#Parser[CeeExpr] 来引用嵌套类。 scala 中的嵌套类型是 pathdependent (意味着嵌套类型对于外部类型的每个 instance 都是不同的)。 # 语法解决了这个问题。
      • 这与它的特质无关。如果它是一个类,它会给出同样的问题。
      • @Daniel 这是真的吗?我应该试试。我想如果 Parser 是一个类,那么 CeeParser.Parser 肯定是 Parsers.Parser 的一个实例,所以导入会起作用。
      • CeeParser 的导入有效,Parsers 的导入无效。类既不是包也不是对象。您不能从中导入东西,只能从它的实例中导入。并不是你的解决方案不正确,只是类/特征与它没有任何关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2013-03-06
      • 2016-10-27
      • 1970-01-01
      • 2015-10-12
      • 2011-04-12
      相关资源
      最近更新 更多