Я написал парсер, который действует как лексер. Этот лексер анализирует файл и возвращает список токенов, каждый из которых является классом case или объектом, расширяющим общий признак.
Сейчас я пытаюсь написать парсер для вывода лексера, но столкнулся с очень запутанной загвоздкой. Синтаксический анализатор счастлив неявно преобразовать мои объекты case, но испортится, если я даже попытаюсь вызвать apply(classHere)
вручную.
Ниже приведена упрощенная версия моего кода:
// CODE
trait Token
case class StringWrapperIgnoresCase(val string: String) {
private case class InnerWrapper(s: String)
lazy val lower = string.toLowerCase
override lazy val hashCode = InnerWrapper(lower).hashCode
override def equals(that: Any) =
that.isInstanceOf[StringWrapperIgnoresCase] &&
lower == that.asInstanceOf[StringWrapperIgnoresCase].lower
}
case class ID(val text: String)
extends StringWrapperIgnoresCase(text)
with Token {
override def toString = "ID(" + text + ")"
}
case object PERIOD extends Token
object Parser extends Parsers {
type Elem = Token
def doesWork: Parser[Token] = PERIOD
def doesNotWork: Parser[Token] = ID
}
Компилятор сообщает следующее сообщение о doesNotWork
:
// ERROR MESSAGE
type mismatch; found : alan.parser.ID.type (with underlying type object alan.parser.ID) required: alan.parser.Parser.Parser[alan.parser.Token]
Как я могу это исправить?