16 Stimmen

Scala: Wie man Parser-Kombinatoren aus verschiedenen Objekten kombiniert

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X