Wie kombiniere ich bei einer Familie von Objekten, die Parser-Kombinatoren implementieren, die Parser? Da Parsers.Parser
ist eine innere Klasse, und in Scala inneren Klassen sind an die äußeres Objekt wird die Geschichte etwas kompliziert.
Hier ist ein Beispiel, das versucht, zwei Parser von verschiedenen Objekten zu kombinieren.
import scala.util.parsing.combinator._
class BinaryParser extends JavaTokenParsers {
def anyrep: Parser[Any] = rep(any)
def any: Parser[Any] = zero | one
def zero: Parser[Any] = "0"
def one: Parser[Any] = "1"
}
object LongChainParser extends BinaryParser {
def parser1: Parser[Any] = zero~zero~one~one
}
object ShortChainParser extends BinaryParser {
def parser2: Parser[Any] = zero~zero
}
object ExampleParser extends BinaryParser {
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep
def main(args: Array[String]) {
println(parseAll(parser, args(0) ))
}
}
Dies führt zu folgendem Fehler:
<console>:11: error: type mismatch;
found : ShortChainParser.Parser[Any]
required: LongChainParser.Parser[?]
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep
Ich habe die Lösung für dieses Problem bereits gefunden, aber da es angesprochen wurde kürzlich auf scala-user ML ( Problem beim Einfügen eines Parsers in einen anderen ), lohnt es sich wahrscheinlich, sie auch hier zu veröffentlichen.