純屬瞎寫借鑒,我覺得很好懂,給那些不懂的人看
計算FIRST集:
① 根據定義計算:
對每一文法符號X∈V 計算FIRST(X)
(a) 若X∈VT,則FIRST(X)={X}
(b) 若X∈VN,且有產生式X→a…,a∈VT, 則 a∈FIRST(X)
(c) 若X∈VN,X→ε,則ε∈FIRST(X)
(d) 若X, Y1,Y2,…,Yn都∈VN,且有產生式X→Y1 Y2 …
Yn;當Y1 Y2 … Yi-1都ε時,(其中1≤i≤n),則FIRST(Y1)-
{ε}、FIRST(Y2) -{ε} 、…、FIRST(Yi-1)- {ε},FIRST(Yi)
都包含在FIRST(X)中
(e) 當(d)中所有Yi ε,(i=1,2,…n),則
FIRST(X)=FIRST(Y1)∪FIRST(Y2)∪…∪FIRST(Yn)∪{ε}
(f)反復使用上述(b)~(e)步直到每個符號的FIRST集合不再增
大為止
② 由關系圖法求文法符號的FIRST集:
(a)每個文法符號對應圖中一個結點,對應終結符的結點時用
符號本身標記,對應非終結符的結點用FIRST(A)標記。這
里A表示非終結符
(b)如果文法中有產生式A→αXβ,且α ε,則從對應A的
結點到對應X的結點連一條箭弧
(c)凡是從FIRST(A)結點有路徑可到達的終結符結點所標記的
終結符都為FIRST(A)的成員
(d)由判別步驟1)確定ε是否為某非終結符FIRST集的成員,
若是則將ε加入該非終結符的FIRST集中
3)計算FOLLOW集:
① 根據定義計算:
對文法中每一 A∈VN 計算 FOLLOW(A)
(a)設S為文法中開始符號,把{#}加入FOLLOW(S)中(這里“#”為句子括號)
(b)若A→αBβ是一個產生式,則把FIRST(β)的非空元素加入
FOLLOW(B)中。
如果β ε則把FOLLOW(A)也加入FOLLOW(B)中
(c)反復使用(b)直到每個非終結符的FOLLOW集不再增大為止
② 由關系圖法求非終結符的FOLLOW集:
(a)文法G中的每個符號和“#”對應圖中的一個結點,對應終結符和“#”的結點用符號本身標記。對應非終結符的結點(如A∈VN)則用FOLLOW(A)或FIRST(A)標記
(b)從開始符號S的FOLLOW(S)結點到“#”號的結點連一條箭弧
(c)如果文法中有產生式A→αBβX,且β ε,則從
FOLLOW(B)結點到FIRST(X)結點連一條弧,當X∈VT時,則
與X相連
(d) 如果文法中有產生式A→αBβ,且β ε,則從
FOLLOW(B)結點到FOLLOW(A)結點連一條箭弧
(e) 對每一FIRST(A)結點如果有產生式A→αXβ,且
α ε, 則從FIRST(A)到FIRST(X)連一條箭弧
(f)凡是從FOLLOW(A)結點有路徑可以到達的終結符或“#”號的結點,其所標記的終結符或"#"號即為FOLLOW(A)的成員