左再帰と左因数分解-どちらが先に行くのですか?


8

左再帰と左分解の両方を含むプロダクションを持つ文法がある場合

FFBa|cDS|c

左再帰または左因数分解のどちらが優先されますか?


1
どの構文解析戦略を使用していますか?再帰的下降の場合、左再帰は絶対に避けなければなりません。たとえば、LL解析を行う場合は、左因数分解が重要です。
ケン・リー

2
すみません、書くのを忘れました。私はトップダウンのパーサー戦略(LL(1))を使用しています
Andrea Tucci

inst.eecs.berkeley.eduによると、それは同じです!(第3演習)
Andrea Tucci

回答:


12

左因数分解や左再帰の削除などの変換には、優先ルールはありません。明らかに、結果の文法は異なる場合がありますが、同じ言語を認識します。

質問の文法の例は、一般的な学部生の宿題の問題よりも難しいです。ですから私たちの仕事を見せることは有用でしょう。

左再帰

左再帰を削除する変換を定義しましょう。

与えられた

α0|α1||α|Bβ0|Bβ1||Bβ

次のように左再帰を削除します。

hBβ0|Bβ1||Bβtα0|α1||αt+tt+|tht+|h

上記の一般性は通常コンパイラーのテキストでは与えられていませんが、Grune&Jacobsのような構文解析テキストはこれをカバーしています。左因数分解は、上記の変換された文法に適用できますが、答えを変更しない追加のルールを導入するだけです。そのため、余分な左因数分解を実行せずにプレゼンテーションを簡略化します。

この回答では、間接的な左再帰の問題については取り上げません。これは、単一の非ターミナルのルールのみに関係しているためです。ただし、間接的な左再帰は処理できます。(それが重要な場合は、別の質問を開いてください。)

左因数分解

左因数分解の削除は、このように行われるほとんどの入門用コンパイラーテキストにあります。与えられた

バツy|バツz

左因数生成:

sy|zバツs

これで、両方の順序で変換が実行されます。

最初に左因数分解

質問の文法を残してみましょう

FsDS|εFFBa|cFs

左の再帰を削除します。

FhcFsFtBaFt+FtFt+|FtFsDS|εFFhFt+|Fh

最初に左再帰を削除する

そして、他の順序付けのために、質問の文法から左再帰を削除しましょう

FhcDS|cFtBaFt+FtFt+|FtFFhFt+|Fh

そして、端末を因数分解しました c

FhsDS|εFhcFhsFtBaFt+FtFt+|FtFFhFt+|Fh

ああ、結果の文法は同じです!

一般に、2つの文法が同等であることを証明することは不可能です。したがって、一連の文法変換がそのときに認識される言語に影響を与える可能性がある場合、それは悲惨です。


説明ありがとうございます。したがって、左再帰と左因数分解の両方がある場合は、どちらを先に削除するかを選択できます。ありがとうございました
Andrea Tucci

「一般的に、2つの文法が同等であることを証明することは決定不可能です。」-これが不可能であることを証明するという意味ですか、それとも常にそれを行うアルゴリズムがないということですか 後者だけが正しいです。また、1つの順序だけで言語を変更しない場合でも、「悲惨なこと」にはなりません。その場合、正しい順序を使用する必要があります。ただし、両方の変換を別の変換とは独立して使用する場合、生成された言語に影響を与えないことは明らかです。
ラファエル

わかりやすくするために、ここには非常に高度なフォーマットツール(MarkdownおよびLaTeX)があります。私はそれに応じてあなたの投稿を編集しました、見てください。
ラファエル

1
@Raphael「証明する」言語があいまいで、「悲惨な」言葉遣いが誇張されている。良いキャッチ。
コデア

@Raphael構文の説明をありがとう。
コデア2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.