2

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"
4

1 に答える 1

1

Packrat パーサーは左再帰をサポートしていますが、ルール間のサイクル (進行なし) をサポートしていますか。

それがここにあります: abc は、abc を呼び出すことができる ab を呼び出します。

| を入れてみてください。abc ルールで循環を回避します。

于 2011-03-28T08:28:00.877 に答える