LL(k)とLR(k)の文法を区別する方法はありますか?


12

私は最近、コンパイラの設計について勉強しています。LL文法とLR文法の2種類の文法について知りました。

また、すべてのLL文法がLRであり、LL文法がLR文法の適切なサブセットであるという事実も知っています。1つ目はトップダウン解析で使用され、2つ目はボトムアップ解析で使用されます。

しかし、特定の文法がLLまたはLRであると言えるようにする方法はありますか?


3
およびL R k テーブルを生成し、それらに競合が含まれているかどうかを確認するための標準的な手法を使用してはどうですか?L L 1 およびL R 1 は、通常、解析に関する標準的な教科書で扱われます。L L K およびL R K 技術は、ビット困難見つけることであるが、よく知られています。LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
アレックス10ブリンク

@AlextenBrinkこれは、あなたが答えを出すことができるかのように聞こえます!(おかえりなさい、あなたがいなかった!)
ラファエル

文法がLLであるかLRであるかを確認するための標準的な手法を使用するのは適切ですが、長い方法です。私は、Aho-Lam-Sethi-UllmanによるCompilersの本で見つけた、これを見つける小さな方法を試みています。
デブ

回答:


11

および L R k 文法は、それらが効率的に解析できるというだけでなく、文法が L L k または L R LL(k)LR(k)LL(k)LR(k)、およびそれらのテーブルを生成できるためです(解析テーブルは入力文字列の解析に使用されます)。これらの2つのクラスの場合、構文解析テーブルを使用すると、テーブルにエラーがない場合にのみ文法がクラスにあるかどうかをすぐに確認できることに注意してください。また、はい、解析テーブルがある場合は効率的に解析できますが、存在する場合はテーブルを生成できない文法のクラスがあります。

解析方法に関する教科書では、メソッドとL R 1 のテーブルを生成する方法を説明します(S L R 1 がより一般的です)。Sippuによる解析理論やSoisalon-Soininenなどの教科書も、L L k およびL R k の解析テーブル生成を扱います。LL(1)LR(1)SLR(1)LL(k)LR(k)文法。

残念ながら、本当に奇妙な文法のために、のための解析テーブルL R K (ないためただしL L 1 )爆破と巨大になることができます。kが十分に高い場合、通常の文法でもこれを行います。文法がL L k L R k かを確認できるテストがありますLL(k)LR(k)LL(1)kLL(k)LR(k)多項式時間で実行されるかどうか(テーブル生成は指数関数的です)。詳細については、上記の教科書をお読みください。多くの場合、テーブルのサイズは適切であるため、テストは不要です。

プログラムが機能するかどうかを確認するために値を試したくないが、代わりに、文法がL L k またはL R k )になるようなkの値が存在するかどうかをコンピューターに把握させたい場合、これは決定できないため、残念ながら運がありません。ただし、一部のkで文法がL R k である場合、おそらくcとは異なるcで文法がL L c であるかどうかを判断できますkkLL(k)LR(k)LR(k)kLL(c)ck(詳細はこちらをご覧ください)。


言語がLR(k)かどうかをテストするための多項式時間アルゴリズムの詳細をどこで見つけることができるか知っていますか(教科書の購入は別として)。
user541686

2

すべてのLL文法はLRであり、LLはLRの適切なサブセットであるため、文法がLLであるかどうかのみをチェックする必要があります。したがって、文法がLLの場合、LRでなければなりませんが、すべてのLRはLLではありません。

A-> C | Dの場合、文法GはLLにあり、次の条件が満たされる必要があります。

  1. First(C)とFirst(D)は互いに素な集合です。
  2. 空がFirst(D)にある場合、First(C)とFollow(A)は互いに素な集合であり、同様に空はFirst(C)にあります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.