之前我们说过了这个LR(0)分析和SLR(1)分析,LR(0)分析是把规约项的对应规则的序号填到所有的非终结符中,这个SLR(1)分析则是把规约项对应规则的序号写到FOLLOW集中。而如果FOLLOW集中出现了和移进项的冲突那么就称为移进规约冲突。即此时的FOLLOW集和这个移进项有交集。那么此时就要采取一种新的分析方法LR(1)分析。
LR(1)分析同上述两种分析方式不同的是添加了一个向前搜索符号。在搜索符号的前面加上一个“,”来表示界符。
对于LR(1)分析有几项要注意的地方
1.移进和规约的向前搜索符号不会发生变化。
2.待约项的搜索符号会发生变化(因为对于一个待约项来说它要把所有能写的都给写出来)
3.它是一个非终结符对应一个搜索符号,如果前后两个非终结符相同的话,我们要看当前的(未入栈的非终结符是哪个)来决定这个搜索符号。
若有A->αDβ,a
可以看出A的搜索符号为a
若D的搜索符号为FIRST(βa)。
之所以为βa是因为这个β可能为空,当β为空的时候,此时的搜索符号就为a。
在最后进行规约的时候把规约项对应的序号填入搜索符号对应的框中即可
下面介绍一下这个LALR(1)分析。
LALR(1)分析合并了相同的同芯集,所谓的相同的同芯集就是除搜索符号外前面都是一样的集合。在填写表的时候把这个状态写到一块即可。合并之后无规约-规约冲突即得到LALR(1)。