LR与SLR(FOLLOW集与搜索符)的区别
巩怎么读LR与SLR(FOLLOW集与搜索符)的区别
语法分析中,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集计算⽅法中的第1、2条(第1步骤在这⾥没有体现)。这样带来的后果就是:搜索符集⼀定会出现于某个句型中,且紧跟于,其项⽬中产⽣式左部的⾮终结符之后。⽽FOLLOW集的元素却未必。
步骤2能保证所求紧跟于⾮终结符之后。因为⽂法语⾔中,若A->αBβ是⼀个产⽣式,则⼀定有⼀个句型含αBβ短语,进⽽将B分解,此薰衣草作用
时FIRST(β)必跟其后。
步骤3则不然。其思路可以理解成,跟在A后的终结符就⼀定跟在B后⾯。这样的推理是没有错的,但问题在于要将B归约成A,B前⾯得出现α,若⽆α,即使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前⾯
有”*”号。