私は最近、コンパイラの設計について勉強しています。LL文法とLR文法の2種類の文法について知りました。
また、すべてのLL文法がLRであり、LL文法がLR文法の適切なサブセットであるという事実も知っています。1つ目はトップダウン解析で使用され、2つ目はボトムアップ解析で使用されます。
しかし、特定の文法がLLまたはLRであると言えるようにする方法はありますか?
私は最近、コンパイラの設計について勉強しています。LL文法とLR文法の2種類の文法について知りました。
また、すべてのLL文法がLRであり、LL文法がLR文法の適切なサブセットであるという事実も知っています。1つ目はトップダウン解析で使用され、2つ目はボトムアップ解析で使用されます。
しかし、特定の文法がLLまたはLRであると言えるようにする方法はありますか?
回答:
および L R (k )文法は、それらが効率的に解析できるというだけでなく、文法が L L (k )または L R (、およびそれらのテーブルを生成できるためです(解析テーブルは入力文字列の解析に使用されます)。これらの2つのクラスの場合、構文解析テーブルを使用すると、テーブルにエラーがない場合にのみ文法がクラスにあるかどうかをすぐに確認できることに注意してください。また、はい、解析テーブルがある場合は効率的に解析できますが、存在する場合はテーブルを生成できない文法のクラスがあります。
解析方法に関する教科書では、メソッドとL R (1 )のテーブルを生成する方法を説明します(S L R (1 )がより一般的です)。Sippuによる解析理論やSoisalon-Soininenなどの教科書も、L L (k )およびL R (k )の解析テーブル生成を扱います。文法。
残念ながら、本当に奇妙な文法のために、のための解析テーブルとL R (K )(ないためただしL L (1 ))爆破と巨大になることができます。kが十分に高い場合、通常の文法でもこれを行います。文法がL L (k )かL R (k )かを確認できるテストがあります多項式時間で実行されるかどうか(テーブル生成は指数関数的です)。詳細については、上記の教科書をお読みください。多くの場合、テーブルのサイズは適切であるため、テストは不要です。
プログラムが機能するかどうかを確認するために値を試したくないが、代わりに、文法がL L (k )またはL R (k )になるようなkの値が存在するかどうかをコンピューターに把握させたい場合、これは決定できないため、残念ながら運がありません。ただし、一部のkで文法がL R (k )である場合、おそらくcとは異なるcで文法がL L (c )であるかどうかを判断できます(詳細はこちらをご覧ください)。