2

は、私はPackratパーサを持つ文字列ABCを解析しようとしますPackratパーサの競合

ここ
lazy val abc: PackratParser[AnyRef] = ab ~ "c" 

    lazy val ab: PackratParser[AnyRef] = (ab | abc) ~ "b" | "a" 

    def parse(in: String) = parseAll(abc, in) 

私はPackratパーサでサポートされている左再帰を使用しますが、それが失敗した理由を私は理解していません。 Parser documentation P |によれば、

lazy val ab: PackratParser[AnyRef] = ab ~ "b" | "a" 

答えて

1

Packratパーサが左再帰をサポートしていますが、それをしない:Pが成功した場合、この場合にはabは「AB」の代わりに、それは私がabを置き換えないかのように「」に置き換える必要がありますので、Qは、Pに等しいですルール間のサイクルをサポートします(進捗なし)。

これはあなたがここにいるものです:abcは、abcを呼び出すことができるabを呼び出します。

多分、あなたは|そのサイクルを避けるためにabcルールで。