2010-03-27 4 views
4

J'ai le message d'erreur étrange ci-dessus que je ne comprends pas "valeur Parsers n'est pas un membre du paquet scala.util.parsing.combinator". J'essaie d'apprendre les combinateurs Parser en écrivant un analyseur C étape par étape. J'ai commencé au jeton, donc j'ai les classes:ce qui ne va pas: "value Parsers n'est pas un membre du paquet scala.util.parsing.combinator"?

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 

Ceci est aussi simple que je pourrais le faire.

Le code ci-dessous fonctionne très bien, mais si je décommentez la ligne commentée je reçois le message d'erreur ci-dessus:

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) 
    } 
} 

Dans le cas où il y a un problème avec ma configuration, j'utilise scala 2.7.6 via le scala-plugin pour intellij. Quelqu'un peut-il nous éclairer à ce sujet? Le message est faux, Parsers est un membre de scala.util.parsing.combinator.

--- Suivi

Cette personne http://www.scala-lang.org/node/5475 semble avoir le même problème, mais je ne comprends pas la réponse qu'il a reçu. Quelqu'un peut-il l'expliquer?

Répondre

4

Le problème est que Parser est une sous-classe de Parsers, de sorte que la bonne façon de se référer il provient d'une instance de Analyseur. Autrement dit, CeeParser.Parser est différent de tout autre x.Parser. La manière correcte de faire référence au type de CeeParser.token est CeeParser.Parser.

1

Le problème est que les analyseurs ne sont pas un package ou une classe, c'est un trait, donc ses membres ne peuvent pas être importés. Vous devez importer de la classe spécifique étendant le trait.

Dans ce cas, la classe spécifique est CeeParser de sorte que le type de val doit être CeeParser.Parser [CeeExpr]:

val parser : CeeParser.Parser[CeeExpr] 
+0

Il est également possible de se référer à la classe imbriquée en utilisant la syntaxe 'scala.util.parsing.combinator.Parsers # Parser [CeeExpr]'. Les types imbriqués dans scala sont * dépendants du chemin * (ce qui signifie que le type imbriqué est différent pour chaque * instance * du type externe). La syntaxe '# 'contourne cela. –

+0

Cela n'a rien à voir avec la caractéristique de celui-ci. Cela donnerait le même problème si c'était une classe. –

+0

@Daniel est-ce vrai? Je devrais essayer. Je pensais que si Parser était une classe, alors CeeParser.Parser serait certainement une instance de Parsers.Parser, donc l'importation fonctionnerait. –

Questions connexes