【編譯原理】大白話講解 First 集和 Follow 集的構造算法


First集構造流程


 

  對於 X -> ... 這條產生式而言,

    【1】若右邊第一個符號是終結符或 ε  ,則直接將其加入 First(X)

    【2】若右邊第一個符號是非終結符,則將其 First 集的的非 ε  元素加入 First(X)

    【3】若右邊第一個符號是非終結符而且緊隨其后的是很多個非終結符,這個時候就要注意是否有 ε 

      【3.1】若第 i 個非終結符的 First 集有 ε  ,則可將第 i+1 個非終結符去除 ε  的 First 集加入 First(X)。

      【3.2】若所有的非終結符都能夠推導出 ε ,則將  ε  也加入到 First(X)

 

    E.G. G[S]:

      S -> ABCD

      A -> a |  ε  

      B -> b |  ε  

      C -> c

      D -> d

      解:

        First(S) = {a, b, c},其中 c 是由上面所說的第二、三條規則所推得出來的,因為此時 A 和 B 都可以等於空串( ε  ),所以非終結符 C 的 first 集合就被加入 G[S] 了。

        如果這里 C,D 也能夠產生 ε  的話,根據第三條規則中的第二小點,此時 First(S) = {a, b, c, d,  ε}

 

 

Follow集構造流程


 

  【1】將所有產生式的候選式(即產生式右部)的非終結符都找到,定位到你想要求解 Follow 集的非終結符的位置,從當前位置往后挨個檢查。設 A -> aBC 是一個產生式,在這個產生式中, B 和 C 是非終結符,a 是終結符

  【2】先檢驗這個非終結符的右邊還有沒有別的符號(終結符或非終結符都可以),在例子中 B 是需要檢查的第一個非終結符,它的右邊是有非終結符 C 的。

    【2.1】若右邊有符號 -> 將 First(右側第一個符號)的非 ε 集合加入到 Follow(當前符號)中,如果 First(右側第一個符號)含有 ε  ,即有 ... -> ε ,則將 Follow(產生式左部符號)加入 Follow(當前符號)中。

     E.G.  用 A -> aBC 來說就是,當前掃描到 B 了,而 B 的右側有非終結符 C,則將去掉 ε  的 First(C)加入 Follow(B)中。若存在 C -> ε  ,則將 Follow(A)也加入 Follow(B)中。

    【2.2】若右邊沒有符號了,例如這里的 C,那么可以將 Follow(A)中的元素全部加入到 Follow(C)中。

  【3】判斷當前符號是不是文法的開始符號,比如 G[A] 中的非終結符 A 就是 G[A] 文法的開始符號,如果是的話就將“#”也加入到 Follow(當前符號)中去。

 

 

預測表的構造


 

  首先構造出預測分析表的第一行與第一列,第一行為文法出現的所有終結符以及‘#’(注意:沒有 ε ,因為 Follow 集不含 ε),第一列為文法出現的所有終結符。

  然后對文法 G 的每個產生式 A -> ab 都執行如下操作:

    【1】對於每個屬於 First(ab) 的終結符 m ,都把 A -> ab 添加到預測表中的 [A, m] 中去

    【2】如果 ε 也屬於 First(ab),那么對於任何屬於 Follow(A) 的字符 x,都把 A ->  ε  加入到 [A, x] 中去

 


免責聲明!

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



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