パーサー コンビネーターを実装するオブジェクトのファミリが与えられた場合、どのようにパーサーを組み合わせることができますか? Parsers.Parser
はインナー クラスであり、Scala ではインナー クラスはアウター オブジェクトにバインドされるため、話は少し複雑になります。
以下は、異なるオブジェクトからの 2 つのパーサーを結合しようとする例です。
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) ))
}
}
これにより、次のエラーが発生します。
<console>:11: error: type mismatch;
found : ShortChainParser.Parser[Any]
required: LongChainParser.Parser[?]
def parser: Parser[Any] = (LongChainParser.parser1
||| ShortChainParser.parser2) ~ anyrep
この問題の解決策は既に見つけましたが、最近 scala-user ML (パーサーを別のパーサーに挿入する問題) で取り上げられたので、ここにも置く価値があるでしょう。