編譯原理 求解first集和follow集步驟(附例子)

First

定義:對於任意文法符號串α ,FIRST(α)是可從α推導得到的串的首符號的集合

如果αε,則ε也在FIRST(α)中( 即α可空)

FIRST(α)={t|α-->tβ, t∈T}U{ε|α-->ε}

做法:首先明確FIRST集合是對推導符號後面的首符號(僅僅只是一個符號)進行判斷的

步驟:

假設 α-->tβ,求FIRST(α)

① 如果首符號t是終結符則直接放入first集合中

②如果t不是非終結符:

            i.如果t—>ε,則將ε加入FIRST(α),並且將β進行①②操作判斷。

ii.如果t不是ε,那麼求first(t),並將first(t)的結果放入FIRST(α)中。

Follow

假設A àαBβ,A àαB,求follow(B)

做法:尋找B在à右邊出現的規則式,然後按照以下步驟進行操作

步驟:

①如果A是開始符, 將$加入FOLLOW(A), 這裏$是輸入結束標記.

②對於A àαBβ,首先判斷β是不是可以推出ε

i.如果不能推出ε,那麼將first(β)加入follow(B)

ii.如果推出ε,那麼將{first(β)- ε}Ufollow(A)

③對於A àαB,將follow(A)結果加入follow(B)。

 

注意:Follow一般從上往下找,而且第一輪的時候有時候不能夠將所有的follow都填滿,所以要採用迭代的方式不斷循環。

有時候遇到閉環的時候,先假設按照第一遍 把所有的都算出來後,第二輪的時候將所有集合制空,如果有變化,則在進行一輪,直到沒有變化爲止。

 

例如:

 

先列出計算兩個集合的式子:

FOLLOW(E)={#} U {)} U FOLLOW(E')

FOLLOW(E')=FOLLOW(E)

然後迭代執行這兩個式子:

首先假設兩個集合都是空

第一輪:

計算FOLLOW(E)={#,)}

此時FOLLOW(E)已經非空了,

接下來算出FOLLOW(E')={#,)}

此輪FOLLOW集有變化,再進行下一輪:

第二輪:

計算FOLOW(E)={#,)}

FOLLOW(E')={#,)}

此輪沒有新變化,迭代計算過程結束。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章