は、LL文法が定義され:任意の生産A -> a|b
ために、以下の2つの条件が当てはまる場合だけなぜLL文法を左回帰的に使うことができないのですか?次のように<em><a href="http://en.wikipedia.org/wiki/Compilers%3a_Principles,_Techniques,_and_Tools">dragon book</a></em>で
文法はLLです。
FIRST(a)
とFIRST(b)
は互いに素です。これはb
は、その後a
がFIRST(a)
とFOLLOW(A)
は互いに素でなければならないですFOLLOW(A)
で始まる任意の文字列を導き出すことができない、EMPTY
を引き出すことができれば、彼らは両方のEMPTY
を導き出すことができないことを意味します。
LL文法は再帰的に残ることはできませんが、正式な理由は何ですか?左回帰文法はルール2に反するだろうと思いますよね? FIRST(SA) = {a, empty}
とFOLLOW(S) ={$, a}
、その後、FIRST(SA)
とFOLLOW(S)
は互いに素ではないので、この文法はLLではありませんので
S->SA|empty
A->a
:例えば、私は、次の文法を書きました。しかし、私はそれが左回帰であるかどうか分かりませんFIRST(SA)
とFOLLOW(S)
は別の理由がありますか?別の言い方をすれば、すべての左回帰文法がLL文法の条件2に違反する生産をすることは事実ですか?
S -> SA
S -> empty
A -> a
今すぐ文字列aaa
を考慮してください。
S->SA|empty
A->a
これは、3つの規則の省略形です:
'' FIRST [1](SA) ''は '' {a} ''です。 – Apalala
理論的な問題は、 '' LA(S-> SA) ''と '' LA(S-> e) ''両方に '' a''が含まれていることです。より直感的な説明のために私の答えを見てください。 – Apalala