有什么问题:“值Parsers不是包scala.util.parsing.combinator的成员”?

时间:2010-03-27 13:15:02

标签: scala parser-combinators

我收到了以上奇怪的错误消息,我不明白“值Parsers不是包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为intellij使用scala 2.7.6。任何人都可以对此有所了解吗?该邮件错误,Parsersscala.util.parsing.combinator的成员。

---后续行动

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

2 个答案:

答案 0 :(得分:4)

问题是ParserParsers的子类,因此引用它的正确方法是来自 Parser的实例 。也就是说,CeeParser.Parser与其他x.Parser不同。

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

答案 1 :(得分:1)

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

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

val parser : CeeParser.Parser[CeeExpr]