Packrat パーサーで文字列abcを解析しようとするとします。
lazy val abc: PackratParser[AnyRef] = ab ~ "c"
lazy val ab: PackratParser[AnyRef] = (ab | abc) ~ "b" | "a"
def parse(in: String) = parseAll(abc, in)
ここでは、Packrat パーサーでサポートされている左再帰を使用していますが、なぜ失敗するのかわかりません。パーサーのドキュメントによると P | P が成功した場合、Q は P に等しいため、この場合、次のようにab
置き換えた場合と同様に、「a」ではなく「ab」に置き換える必要がありab
ます。
lazy val ab: PackratParser[AnyRef] = ab ~ "b" | "a"