レクサーとして機能するパーサーを作成しました。このレクサーはファイルを解析し、トークンのリストを返します。各トークンは、共通の特性を拡張するケースクラスまたはオブジェクトです。
現在、レクサーの出力用のパーサーを作成しようとしていますが、非常に紛らわしい問題が発生しました。パーサーは、ケースオブジェクトを暗黙的にキャストできますが、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]
どうすればこれを修正できますか?