編譯原理復習總結--FIrst集、Follow集、Select集、LL(1)文法的判斷以及分析過程總結


構造First集合

First集合的大白話定義:

  • 定義:就是由某個非終結符能夠推導出來的句子的句首符號的集合,就是這個非終結符的First集合

構造方法:

構造First集合有以下幾種情況:

  • E->aB,即以終結符開頭的,直接將其加入左部非終結符的First集合中。First(E)<==a

  • E->AB,即以非終結符開頭*的,但是這種有兩種小情況

    • A!=>*ε,即不能由A推導出ε,則只需要把First(A)加入到First(E)。First(E)<==First(A)
    • A=>*ε,即A可以經過若干步推導得ε,則也需要吧B的First集合加入到First(E)。First(E)<==First(A)+First(B)

    例子:

    E->TA
    A->+TA|ε
    T->FB
    B->*FB|ε
    F->i|(E)
    

    line1:E是以T開頭,是非終結符,且無法推出ε,故將First(T)==>First(E)

    line2:A是以+/ε開頭,是終結符,則將{+、ε}==>First(A)

    line3:T是以F開頭,是非終結符,且無法推出ε,故將First(F)==>First(T)

    line4:B是以*/ε開頭,是終結符,則將{*、ε}==>First(B)

    line5:F是以i/(開頭,是終結符,則將{i、(}==>First(F)

    編寫程序需循環執行上述的操作,直至所有的First集合沒有再變化為止


構造Follow集合:

Follow集合的大白話定義:

  • 定義:對於某個非終結符,緊跟在其后面的終結符的集合就是這個非終結符的Follow集

構造方法:

構造Follow集合有以下幾種情況:

  • E->...Ab...,即在產生式中任意位置存在 一個非終結符 + 一個終結符,則將終結符加入到非終結符的Follow集合中,即Follow(A)<==b
  • E->...AB...,即在產生式中存在 兩個非終結符相鄰,且B不在末尾,則將B的First集合減去ε再加入到A的Follow集合中,即Follow(A)<==First(B)-ε
  • E->...AB,即在產生式中存在 兩個非終結符相鄰,且B在末尾,此時分為兩種情況:
    • B!=>*ε,即B不能推出ε時,需將B的First-ε集加入A的Follow集,且將E的Follow集加入B的Follow集合。即Follow(A) <== First(B) - ε,Follow(B) <== Follow(E)
    • B=>*ε,即經過若干步的推導B能推導出ε,則不僅需要將B的Follow集加入A的Follow集,E的Follow集加入B的Follow集合,還需要將E的Follow集合加入A的Follow集合。即Follow(A) <== First(B) - ε+Follow(E),Follow(B) <== Follow(E)。

例子:

E->TA
A->+TA|ε
T->FB
B->*FB|ε
F->i|(E)

首先第一步將#加入到文法的開始符號E的Follow集中

line1:產生式是兩個相鄰的非終結符,A為末尾且能推出ε,故First(A) -ε ==> Follow(T),Follow(E) ==> Follow(A)

line2:產生式1存在與line1相同的句型,即照着line1的方法做即可,產生式2是空串,不做操作

line3:右部產生式與line1的做法相同,即First(B) -ε ==> Follow(F),Follow(T) ==> Follow(B)

line4:與line2相似,略

line5:對於產生式1不做操作。對於產生式2,存在一個非終結符+終結符,故將 ) ==> Follow(E)

編寫程序需循環執行上述的操作,直至所有的Follow集合沒有再變化為止


構造Select集合:

Select集大白話理解:

  • 定義與作用:Select集是針對產生式而言,對於一個產生式,它所產生的句子的句首符號所構成的集合稱為Select集。其作用就是用於構建預測分析表,以便之后分析時選擇正確的產生式。

構造方法

有了前面First集和Follow集的構造,Select集合的構造就相對比較簡單了,它有兩種情況:

  • 第一種是產生式能產生一個句子,但是不能推導出ε,則Select(E->α)=First(α)
  • 第二種是產生式能推導出ε,則Select(E->α)={First(α)-ε} + Follow(E)

例子:

E->TA
A->+TA|ε
T->FB
B->*FB|ε
F->i|(E)

line1:只有一個候選產生式,且E無法推導出ε,所以Select(E->TA) = First(T)

line2:第二行有兩個候選式,針對第一個候選式A->+TA,因為以+開頭,那么肯定就推不出ε,故Select(A->+TA)=+,而第二個產生式能推出ε,故Select(A->ε) = Follow(A)

line3:與第一行類似,略

line4:與第二行類似,略

line5:針對第一個產生式F->i,滿足第一條規則,所以Select(F->i)=i;針對第二個產生式也是如此。


如何判斷是否符合LL(1)文法:

觀察所有Select集,若左部相同的產生式的Select集的交集不為空,則不符合LL(1)文法,否則滿足。

拿上述例子為例:Select(A->+TA) = {+},Select(A->ε) = {#, )}。 Select(A->+TA) ∩ Select(A->ε) = ф;

​ Select(B->*FB) = {*},Select(B->ε) = {+, #, )}。Select(B->*FB) ∩ Select(B->ε) =ф

​ 綜上所述每個產生式的Select集沒有交集,故上述的例子所示文法為LL(1)文法


預測分析表的構造

預測分析表大白話理解:

  • 定義與作用:預測分析表根據Select集建立,把產生式放到對應的非終結符和終結符所確定的表位置中。作用即根據分析棧中的棧頂元素和符號串的串首字符選擇正確的產生式。

舉例構造

E->TA
A->+TA|ε
T->FB
B->*FB|ε
F->i|(E)
  • Select集
Select(E->TA)= ['i', '(']
Select(A->+TA)= ['+']
Select(A->ε)= ['#', ')']
Select(T->FB)= ['i', '(']
Select(B->*FB)= ['*']
Select(B->ε)= ['+', '#', ')']
Select(F->i)= ['i']
Select(F->(E))= ['(']
  • 預測表

    將每個產生式放到產生式左部非終結符所對應的行,列表中各個終結符所對應的列,最終得

---------------------------------------------------------
|       |   +   |   *   |   i   |   (   |   )   |   #   |
---------------------------------------------------------
|   E   |       |       |  TA   |  TA   |       |       |
---------------------------------------------------------
|   A   |  +TA  |       |       |       |   ε   |   ε   |
---------------------------------------------------------
|   T   |       |       |  FB   |  FB   |       |       |
---------------------------------------------------------
|   B   |   ε   |  *FB  |       |       |   ε   |   ε   |
---------------------------------------------------------
|   F   |       |       |   i   |  (E)  |       |       |
---------------------------------------------------------

分析

分析時即根據對應的棧頂符號和句首符號選擇相應的產生式,注意選擇相應的產生式之后,需要逆序入棧,此乃重點,需要謹記。如果遇到沒有對應產生式的例子,則說明,次句子不符合該語法。

補充一下FirstVT和LastVT的使用方法Firstvt

Firstvt

找Firstvt的三條規則:如果要找A的Firstvt,A的候選式中出現:
A->a.......,即以終結符開頭,該終結符入Firstvt
A->B.......,即以非終結符開頭,該非終結符的Firstvt入A的Firstvt
A->Ba.....,即先以非終結符開頭,緊跟終結符,則終結符入Firstvt

Lastvt
找Lastvt的三條規則:如果要找A的Lastvt,A的候選式中出現:
A->.......a,即以終結符結尾,該終結符入Lastvt
A->.......B,即以非終結符結尾,該非終結符的Lastvt入A的Lastvt
A->.....aB,即先以非終結符結尾,前面是終結符,則終結符入Firstvt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM