4

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

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

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)
  }
}

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

- - 跟进

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

4

2 回答 2

4

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

引用类型的正确方法CeeParser.tokenCeeParser.Parser.

于 2010-03-27T16:46:49.057 回答
1

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

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

val parser : CeeParser.Parser[CeeExpr]
于 2010-03-27T13:59:34.070 回答