web-dev-qa-db-ja.com

言語がLL(1)LR(0)SLR(1)であるかどうかを判断する方法

複雑な分析を行わずに文法を調べるだけで、文法がLL(1)、LR(0)、SLR(1)であるかどうかを判断する簡単な方法はありますか?

例:BNF文法がLL(1)であるかどうかを判断するには、FirstセットとFollowセットを計算する必要があります。これには時間がかかる場合があります。

誰かがこれをより速くする方法を知っていますか?どんな助けでも本当にありがたいです!

23
Chris

まず、ちょっとした衒学者。 languageがLL(1)であるかどうかは、文法を調べて判断することはできません。grammar自体についてのみステートメントを作成できます。 LL(1)文法が存在する言語の非LL(1)文法を書くことは完全に可能です。

それが邪魔にならないように:

  • 文法のパーサーを作成し、プログラムに最初に計算させて、セットやその他のプロパティを追跡させることができます。結局のところ、それがBNF文法の大きな利点であり、機械で理解できるのです。

  • 文法を調べて、さまざまな文法タイプの制約の違反を探します。例:LL(1)は右再帰を許可しますが、左再帰は許可しません。したがって、左再帰を含む文法はLL(1)ではありません。 (他の文法プロパティについては、今は頭のてっぺんから他に何も思い出せないので、定義にある程度の時間を費やす必要があります:)。

34
Aaron Maenpaa

あなたの主な質問への答え:非常に単純な文法の場合、FIRSTセットとFOLLOWセットを作成せずに、それがLL(1)であるかどうかを判断できる場合があります。

A→A + A | A

lL(1)ではありませんが、

A→a | b

です。

しかし、それよりも複雑になると、いくつかの分析を行う必要があります。

A→B | A
B→A + A

これはLL(1)ではありませんが、すぐには明らかにならない場合があります

算術の文法規則はすぐに非常に複雑になります。

expr→term {'+' term}
term→factor {'*' factor}
係数→数| '(' expr ')'

この文法は乗算と加算のみを処理し、文法がLL(1)であるかどうかはすぐにはわかりません。文法を調べて評価することは可能ですが、文法が大きくなるにつれて、実行可能性が低くなります。プログラミング言語全体の文法を定義する場合、ほぼ確実に複雑な分析が必要になります。

とはいえ、上記のA→A + Aのように、文法がLL(1)ではないことを示す明らかな兆候がいくつかあります。これらのいずれかが文法に含まれている場合は、書き直す必要があることがわかります。再帰下降パーサーを作成している場合。しかし、文法がis LL(1)であることを確認するための近道はありません。

15
Bruce Alderman

「言語/文法が曖昧である」という1つの側面は、 既知の決定不可能な質問 のように 通信後 および 停止 問題です。

9
BCS

Ahoらの著書「Compilers:Principles、Techniques&Tools」から直接。 al。

ページ223:

文法GはLL(1)if and only if when A->alpha| betaはGの2つの異なるプロダクションであり、次の条件が当てはまります。

  1. ターミナル「a」がない場合は、alphabetaの両方で文字列を派生させますとともに"
  2. alphabetaの最大1つが空の文字列を導出できます
  3. betaが0個以上の遷移を介して空の遷移に到達できる場合、alphaFOLLOW(A)の端末で始まる文字列は派生しません。同様に、alphaが0個以上の遷移を介して空の遷移に到達できる場合、betaFOLLOW(A)の端末で始まる文字列を派生させません

基本的に、これは文法がペアワイズ非結合性テストに合格し、左再帰を含まないことを確認する問題です。または、より簡潔に言えば、左再帰的またはあいまいな文法GをLL(1)にすることはできません。

9
Matthew Erwin

文法が曖昧かどうかを確認してください。そうである場合、あいまいな文法はLL(1)ではないため、文法はLL(1)ではありません。

2
Ananya Sahu

ll(1)文法のショートカットがあります

1)A-> B1 | B2 | ....... | Bnの場合、first(B1)intersection first(B2)intersection .first(Bn)= empty setの場合、ll(1)文法になります。

2)A-> B1 | epsilonの場合、B1交差点follow(A)は空集合です

3)Gが任意の文法であり、すべての非終端記号が1つの生成のみを導出する場合、その文法はLL(1)です。

0
srinath