LR与SLR(FOLLOW集与搜索符)的区别

LRSLRFOLLOW集与搜索符)的区别

语法分析中,SLR使用的是FOLLOW集,LR使用的是搜索符,这是它们功能强弱不一的根本原因。

FOLLOW集的计算方法:

1.      对于方法的开始符S,置#FOLLOW(S)中;

2.      A->αBβ是一个产生式,则把FIRST(β)/{ ε}加至FOLLOW(B)中;

3.      A->αB是一个产生式,则把FOLLOW(A)加至FOLLOW(B)中。

对于第二条,在FIRST集中除去ε的操作的解释是:跟着一个空输入没有什么意义,如果真的什么都不跟,那么至少有个#垫底,所以没有必要加入ε。

搜索符的计算方法:

教材(陈火旺,国防工业出版社)上没有直接给出搜索符的算法。但在构造LR(1)项目集族的过程中,涉及到了搜索符的计算。下面是求LR(1)项目集闭包的过程:

1.      I的任何项目都属于CLOSURE(I);

2.      若项目[A->α·Bβ,a]属于CLOSURE(I)B->ξ是一个产生式,那么对于FIRST(βa)中的每个终结符b,如果[B->·ξ,b]原来不在CLOSURE(I)中,则把它加入;

3.      重复执行步骤2,直至CLOSURE(I)不再增大。

区别。显然,步骤2涉及了搜索符的计算。在使用一个项目的搜索符时,其实在考查多个搜索符,也就是FIRST(βa)。所以我们把FIRST(βa)叫作搜索符集。有点像FOLLOW集,它也是跟在方法符号后面的终结符。

    从搜索符集的计算过程来看,它是一个更严格的FOLLOW集。因为它只使用了FOLLOW集计算方法中的第12(1步骤在这里没有体现)。这样带来的后果就是:搜索符集一定会出现于某个句型中,且紧跟于,其项目中产生式左部的非终结符之后。而FOLLOW集的元素却未必。

    步骤2能保证所求紧跟于非终结符之后。因为文法语言中,若A->αBβ是一个产生式,则一定有一个句型含αBβ短语,进而将B分解,此时FIRST(β)必跟其后。

    步骤3则不然。其思路可以理解成,跟在A后的终结符就一定跟在B后面。这样的推理是没有错的,但问题在于要将B归约成AB前面得出现α,若无α,即使B后面,出现了FOLLOW(B)也不能归约成A

引用教材的例子。考虑方法:

(1)S->L=R

(2)S->R

(3)L->*R

(4)L->i

(5)R->L

    可以有计算出FOLLOW(R)中含有”=”,但遇到R=的时,也不能做归约处理。因为R前面没有”*”号,而该文法中不含有以R=为前缀的句型。再计算FOLLOW(B),会发现”=”号是由步骤3算出来的。即通过(1)(3)认为跟在L后的终结符就一定跟在R后面,但(3)中要求的是R前面有”*”号。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值