4

「値パーサーはパッケージ 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)
  }
}

セットアップに問題がある場合は、intellij の scala-plugin 経由で 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.tokenは ですCeeParser.Parser

于 2010-03-27T16:46:49.057 に答える
1

問題は、パーサーがパッケージまたはクラスではなく、特性であるため、そのメンバーをインポートできないことです。トレイトを拡張する特定のクラスからインポートする必要があります。

この場合、特定のクラスはCeeParserであるため、のタイプはvalCeeParser.Parser[CeeExpr]である必要があります。

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