first集和follow集的计算

纯属瞎写借鉴,我觉得很好懂,给那些不懂的人看

计算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)的成员
这里写图片描述

这里写图片描述

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值