簡體   English   中英

如何證明左遞歸語法不在LL(1)中使用解析表

[英]How to prove left-recursive grammar is not in LL(1) using parsing table

我有一個語法,並想證明它不在LL(1)中:

S->SA|A
A->a

由於它是一個左遞歸語法,為了找到第一個和后面的集合,我消除了左遞歸並獲得:

S->AS'
S'->AS'|Empty
A->a

first of A={a}      follow of S={$}
first of s'={a,ε}   follow of S'={$}
first of S={a}       follow of A={a,$}

但是當我填寫解析表時,我沒有得到任何包含2個條目的單元格。 那么如何證明給定的語法不在LL(1)中呢?

首先,您要找到FIRST並關注已刪除左遞歸的語法。 因此,當然如果您嘗試創建LL(1)解析表,則不會有任何2個條目,因為刪除了左遞歸並且語法是明確的。

語法[S-> SA | A A-> a]不是LL(1),因為存在左遞歸。 要通過構造LL(1)解析表來證明它,您需要在不修改它的情況下找到此語法的FIRST和FOLLOW。

從底部開始A-> a,給出FIRST(A)= {a}

S-> A,給出FIRST(S)= FIRST(A)= {a}

S-> SA,給出FIRST(S)= FIRST(S),我認為問題出現在這里。 在這樣的遞歸調用中,規則表示計算FIRST(S)直到它改變,即直到元素被添加到FIRST(S)繼續計算。 一旦它停止改變,你就回答了

因此,FIRST(S)= FIRST(S)= {a},您可以多次調用FIRST(S),它不會改變。 解析表:

      a
------------ 
S   S->SA
    S->A
-------------
A   A->a 

因此(S,a)有兩個條目。 因此它不是LL(1)

對於這個左遞歸語法:

S->SA|A
A->a

我們可以消除左遞歸,因為它將提供與Previous Left遞歸語法相同的結果。

S->AS'
S'->AS'|Empty
A->a

first of A={a}      follow of S={$}
first of s'={a,ε}   follow of S'={$}
first of S={a}       follow of A={a,$}

因此,對於上述情況,我們正在檢查LL(1)是否有修改的左遞歸語法(因為它是相同的)。 但是對於跟隨左遞歸語法: -

E -> E+n/n

我們不能修改那個語法,它會改變+運算符的關聯性。

因此,我們唯一要做的就是檢查LL(1)而不進行修改

(E->E+n/n ).

所以,我們可以說E->E+n/n不是LL(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM