什么是错的:“值解析器不是包scala.util.parsing.combinator成员”?
问题描述:
我有上面奇怪的错误信息,我不明白“值解析器不是包scala.util.parsing.combinator成员”。什么是错的:“值解析器不是包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)
}
}
在情况下,它是我的设置有问题,我使用的是2.7.6阶通过intellij的scala-plugin。任何人都可以对此有所了解吗?该消息是错误的,Parsers
是scala.util.parsing.combinator
的成员。
---后续
此人http://www.scala-lang.org/node/5475似乎有同样的问题,但我不明白,他给出了答案。任何人都可以解释吗?
答
的问题是,Parser
是Parsers
子类,因此指的正确方式它来自于实例的解析器。也就是说,CeeParser.Parser
与其他x.Parser
不同。
指代CeeParser.token
类型的正确方法是CeeParser.Parser
。
答
问题是,解析器不是一个包或类,是一个特质,所以它的成员不能被导入。您需要从扩展特征的特定类中导入。
在这种情况下的具体类是CeeParser这样的val
的类型应该是CeeParser.Parser [CeeExpr]:
val parser : CeeParser.Parser[CeeExpr]
也可以使用语法'scala.util.parsing.combinator.Parsers#Parser [CeeExpr]'来引用嵌套类。 scala中的嵌套类型是* path dependent *(表示外部类型的每个* instance *的嵌套类型不同)。 '#'语法解决了这个问题。 – 2010-03-27 16:16:22
这与它的特质无关。如果它是一个班级,它会出现同样的问题。 – 2010-03-27 16:44:09
@丹尼尔是真的吗?我应该尝试一下。我想如果Parser是一个类,那么CeeParser.Parser肯定会是Parsers.Parser的一个实例,所以导入就可以工作。 – 2010-03-29 09:22:19