什么是错的:“值解析器不是包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。任何人都可以对此有所了解吗?该消息是错误的,Parsersscala.util.parsing.combinator的成员。

---后续

此人http://www.scala-lang.org/node/5475似乎有同样的问题,但我不明白,他给出了答案。任何人都可以解释吗?

的问题是,ParserParsers子类,因此指的正确方式它来自于实例解析器。也就是说,CeeParser.Parser与其他x.Parser不同。

指代CeeParser.token类型的正确方法是CeeParser.Parser

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

在这种情况下的具体类是CeeParser这样的val的类型应该是CeeParser.Parser [CeeExpr]:

val parser : CeeParser.Parser[CeeExpr] 
+0

也可以使用语法'scala.util.parsing.combinator.Parsers#Parser [CeeExpr]'来引用嵌套类。 scala中的嵌套类型是* path dependent *(表示外部类型的每个* instance *的嵌套类型不同)。 '#'语法解决了这个问题。 – 2010-03-27 16:16:22

+0

这与它的特质无关。如果它是一个班级,它会出现同样的问题。 – 2010-03-27 16:44:09

+0

@丹尼尔是真的吗?我应该尝试一下。我想如果Parser是一个类,那么CeeParser.Parser肯定会是Parsers.Parser的一个实例,所以导入就可以工作。 – 2010-03-29 09:22:19