LR(0) 分析过程中的冲突
![](https://img.haomeiwen.com/i2196908/15c93b467b6f64e9.png)
当在状态2时输入符号为 * 时候,可以采取移入操作也可以采取归约操作。那到底选用哪一个操作呢?归根结底还是一个如何识别句柄的问题。如果栈顶的T为句柄的话就使用归约操作,否则的话就不能使用归约操作。由此可见LR(0)的信息已经不能帮助我们确定是否进行归约。
事实上LR(0)分析在构造时,向前查看了零个符号,也就是没有向前查看符号,即没有考虑文法符号的上下环境。
上图例子中状态2在下一个符号是*时,如果把栈顶的T归约成E。由上图可知 * 不在FOLLOW(E)中,所以即便归约成E,E后也不可能跟 * ,所以不应该归约,T不是句柄。由此可见FOLLOW集可以帮助判断在哪些情况下不能进行归约,这也是SLR分析法的基本思想。
SLR分析
![](https://img.haomeiwen.com/i2196908/f86cdf999f0eeab3.png)
解决LR(0)文法的移入归约冲突,其实就是加强对文法的约束以避免冲突,其实分析方法中并没因此做出任何改变。
表达式文法的SLR分析表
![](https://img.haomeiwen.com/i2196908/04388da77b51cc31.png)
![](https://img.haomeiwen.com/i2196908/2be80df20fca2cfc.png)
SLR 分析表构造算法
![](https://img.haomeiwen.com/i2196908/dcafba88e1464f95.png)
如果给定文法的SLR分析表中不存在有冲突的动作,那么该文法成为SLR文法。
SLR分析中的冲突
![](https://img.haomeiwen.com/i2196908/0967a7c677621079.png)
由上图可知当状态2遇到等号时遇到了移入归约冲突。某些情况下仅利用FOLLOW集的信息去化解冲突是不够的。为了消解这种冲突需要使用更强大的LR(1)分析法。
网友评论