Dada una familia de objetos que implementan los combinadores de analizadores sintácticos, ¿cómo combino los analizadores sintácticos? Dado que Parsers.Parser
es una clase interna, y en Scala inner classes are bound to the outer object, la historia se vuelve un poco complicada.Scala: Cómo combinar los combinadores de analizadores de diferentes objetos
Aquí hay un ejemplo que intenta combinar dos analizadores de diferentes objetos.
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)))
}
}
Esto da lugar a los siguientes errores:
<console>:11: error: type mismatch;
found : ShortChainParser.Parser[Any]
required: LongChainParser.Parser[?]
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep
he encontrado la solución a este problema ya, pero ya que se crió recientemente en Scala-usuario ML (Problem injecting one parser into another), es probablemente valga la pena ponerlo aquí también.
Gracias por publicar esta pregunta y, por supuesto, ¡por responderla! Esto es exactamente lo que estaba buscando. –