что не так: "значение Parsers не является членом пакета scala.util.parsing.combinator"? - PullRequest
4 голосов
/ 27 марта 2010

У меня есть вышеприведенное странное сообщение об ошибке, которое я не понимаю "значение Parsers не является членом пакета scala.util.parsing.combinator".

Я пытаюсь выучить комбинаторы Parser, написав 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)
  }
}

В случае, если это проблема с моей настройкой, я использую scala 2.7.6 через плагин scala для intellij. Кто-нибудь может пролить свет на это? Сообщение неверное, Parsers является членом scala.util.parsing.combinator.

--- продолжение

Этот человек http://www.scala -lang.org / node / 5475 , кажется, имеет ту же проблему, но я не понимаю ответ, который ему дали. Кто-нибудь может это объяснить?

Ответы [ 2 ]

4 голосов
/ 27 марта 2010

Проблема в том, что Parser является подклассом Parsers, поэтому правильный способ обращения к нему - из экземпляра из Parser . То есть CeeParser.Parser отличается от любого другого x.Parser.

Правильный способ обозначения типа CeeParser.token - CeeParser.Parser.

1 голос
/ 27 марта 2010

Проблема в том, что Parsers не является пакетом или классом, является признаком, поэтому его члены не могут быть импортированы. Вам нужно импортировать из определенного класса, расширяющего черту.

В этом случае конкретным классом является CeeParser, поэтому тип val должен быть CeeParser.Parser [CeeExpr]:

val parser : CeeParser.Parser[CeeExpr]
...