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] 中去