左再帰と左分解の両方を含むプロダクションを持つ文法がある場合
左再帰または左因数分解のどちらが優先されますか?
左再帰と左分解の両方を含むプロダクションを持つ文法がある場合
左再帰または左因数分解のどちらが優先されますか?
回答:
左因数分解や左再帰の削除などの変換には、優先ルールはありません。明らかに、結果の文法は異なる場合がありますが、同じ言語を認識します。
質問の文法の例は、一般的な学部生の宿題の問題よりも難しいです。ですから私たちの仕事を見せることは有用でしょう。
左再帰を削除する変換を定義しましょう。
与えられた
、
次のように左再帰を削除します。
上記の一般性は通常コンパイラーのテキストでは与えられていませんが、Grune&Jacobsのような構文解析テキストはこれをカバーしています。左因数分解は、上記の変換された文法に適用できますが、答えを変更しない追加のルールを導入するだけです。そのため、余分な左因数分解を実行せずにプレゼンテーションを簡略化します。
この回答では、間接的な左再帰の問題については取り上げません。これは、単一の非ターミナルのルールのみに関係しているためです。ただし、間接的な左再帰は処理できます。(それが重要な場合は、別の質問を開いてください。)
左因数分解の削除は、このように行われるほとんどの入門用コンパイラーテキストにあります。与えられた
左因数生成:
これで、両方の順序で変換が実行されます。
質問の文法を残してみましょう
左の再帰を削除します。
そして、他の順序付けのために、質問の文法から左再帰を削除しましょう
そして、端末を因数分解しました :
ああ、結果の文法は同じです!
一般に、2つの文法が同等であることを証明することは不可能です。したがって、一連の文法変換がそのときに認識される言語に影響を与える可能性がある場合、それは悲惨です。