2010-03-27 96 views
4

我有上面奇怪的錯誤信息,我不明白「值解析器不是包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似乎有同樣的問題,但我不明白,他給出了答案。任何人都可以解釋嗎?

回答

4

的問題是,ParserParsers子類,因此指的正確方式它來自於實例解析器。也就是說,CeeParser.Parser與其他x.Parser不同。

指代CeeParser.token類型的正確方法是CeeParser.Parser

1

問題是,解析器不是一個包或類,是一個特質,所以它的成員不能被導入。您需要從擴展特徵的特定類中導入。

在這種情況下的具體類是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

相關問題