Étant donné une famille d'objets qui implémentent des combinateurs d'analyseurs, comment combiner les analyseurs syntaxiques? Puisque Parsers.Parser
est une classe interne, et dans Scala inner classes are bound to the outer object, l'histoire devient légèrement compliquée.Scala: comment combiner des combinateurs d'analyseurs à partir d'objets différents
Voici un exemple qui tente de combiner deux analyseurs d'objets différents.
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)))
}
}
Il en résulte de l'erreur suivante:
<console>:11: error: type mismatch;
found : ShortChainParser.Parser[Any]
required: LongChainParser.Parser[?]
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep
que j'ai trouvé la solution à ce problème déjà, mais depuis qu'il a été élevé récemment sur scala utilisateur ML (Problem injecting one parser into another), il est vaut probablement le mettre ici aussi.
Merci de poster cette question et bien sûr d'y répondre! Ceci est exactement ce que je cherchais. –