【編譯原理】自上而下的語法分析之預測分析法
最近學習了LL(1)文法的預測分析法,這種方法不同於遞迴下降分析法,可直觀通過棧檢視語法分析過程,現總結如下.
1. 定義
第一個L表示從左到右掃描輸入串,第二個L表示最左推導,1表示每步只需向前看一個符號。
LL(1)文法定義: 對於文法的任意兩個不同的產生式A->α|β: –不存在終結符號a使得α和β都可以推匯出以a開頭的串。 –α和β最多隻有一個可以推匯出空串。 –如果β可以推匯出空串,那麼α不能推匯出以FOLLOW中任何終結符號開頭的串; 定義等價於以下定理:定理:若滿足以下條件,則B N F中的文法就是LL(1)文法:
1. 在每個產生式A→a1 | a2 | . . . |an 中,對於所有的i 和j:1≤i,j≤n,i≠j,First (ai )與First (aj )交集為空。
2. 若對於每個非終結符A都有First (A) 包含了ε,那麼First (A)與Follow (A)交集為空。
使用預測分析法需要首先構造預測分析表,構造之前需要構造文法的First集與Follow集, 其定義如下:
(1) First定義:
令X為一個文法符號(可以是terminal也可以是nonterminal)或ε,
則集合First(X)由terminal組成,此外可能還有ε,它的定義如下:
1.若X是terminal或ε,則First(X)={X}。
2 若X是nonterminal,則對每個產生式X—>X1X2.....Xn,
First(X)都包含了First(X1)
若對於某個i<n,所有的First(X1)......First(Xi)都包含了ε,則First(X)也包含了Fitst(X(i+1))-{ε}.
若所有First(Xi)都包含ε,則First(X)也包含ε,(如果X—>ε,很顯然,此時First(X)包含了ε)
3.求任意串的First,這種情況一般是求某個產生式的候選式a的First(a),
先假設a=X1X2....Xn。則First(a)定義為:First(a)包含了First(X1)-{ε},
若對於每個i=2,3,。。。n。有k=1,2,。。。i-1,First(Xk)都包含ε,
則First(a)就包含了First(Xi)-{ε},
最後,如果對於所有的i=1,2,...... First(Xi)都包含ε,則First(a)也包含ε.
(2) Follow定義:
給出一個非終結符(non-terminal)A,那麼集合Follow(A)則是由終結符(terminal)組成,此外可能還有$,
集合Follow(A)定義如下:
1 若A是開始符號,則$就在Follow(A)中。
2 若存在產生式B->aAy,則First(y)-{ε}在Follow(A)中
3 若存在產生式B->aAy,且ε在First(y)中,則Follow(A)也包含Follow(B)
(3) 預測分析表構造
LL(1) 分析表M[N, T] 的構造:為每個非終結符A和產生式A→a 重複以下兩個步驟:
1) 對於First (a)中的每個記號a,都將A→a新增到專案M [A, a]中.
2) 若在First (a)中,則對於Follow (A) 的每個元素a(記號或是$),都將A→a 新增到M[A, a]中。
3. 預測分析法
4. 例子