纯属瞎写借鉴,我觉得很好懂,给那些不懂的人看
计算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)的成员