2010-03-27 1 views
4

У меня появилось выше нечетное сообщение об ошибке, которое я не понимаю. Значение Parsers не является членом пакета scala.util.parsing.combinator.что не так: "значение 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) 
    } 
} 

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

--- Последующий

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

ответ

4

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

Правильный способ ссылки на тип CeeParser.token: CeeParser.Parser.

1

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

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

val parser : CeeParser.Parser[CeeExpr] 
+0

Также можно обратиться к вложенному классу с помощью синтаксиса 'scala.util.parsing.combinator.Parsers # Parser [CeeExpr]'. Вложенные типы в scala * зависят от пути * (что означает, что вложенный тип отличается для каждого * экземпляра * внешнего типа). Синтаксис '#' оборачивается этим. –

+0

Это не имеет никакого отношения к его признанию. Это даст ту же проблему, если бы это был класс. –

+0

@ Даниэль это правда? Я должен попробовать. Я думал, что если Parser был классом, то, несомненно, CeeParser.Parser будет экземпляром Parsers.Parser, поэтому импорт будет работать. –