编译器笔记14-语法分析-SLR分析

2019-11-23  本文已影响0人  衣忌破
LR(0) 分析过程中的冲突
LR(0) 分析过程中的冲突.png

当在状态2时输入符号为 * 时候,可以采取移入操作也可以采取归约操作。那到底选用哪一个操作呢?归根结底还是一个如何识别句柄的问题。如果栈顶的T为句柄的话就使用归约操作,否则的话就不能使用归约操作。由此可见LR(0)的信息已经不能帮助我们确定是否进行归约。

事实上LR(0)分析在构造时,向前查看了零个符号,也就是没有向前查看符号,即没有考虑文法符号的上下环境。

上图例子中状态2在下一个符号是*时,如果把栈顶的T归约成E。由上图可知 * 不在FOLLOW(E)中,所以即便归约成E,E后也不可能跟 * ,所以不应该归约,T不是句柄。由此可见FOLLOW集可以帮助判断在哪些情况下不能进行归约,这也是SLR分析法的基本思想。

SLR分析
SLR分析法的基本思想.png

解决LR(0)文法的移入归约冲突,其实就是加强对文法的约束以避免冲突,其实分析方法中并没因此做出任何改变。

表达式文法的SLR分析表
SLR分析表.png 分析.png
SLR 分析表构造算法
SLR 分析表构造算法.png

如果给定文法的SLR分析表中不存在有冲突的动作,那么该文法成为SLR文法。

SLR分析中的冲突
移入归约冲突.png

由上图可知当状态2遇到等号时遇到了移入归约冲突。某些情况下仅利用FOLLOW集的信息去化解冲突是不够的。为了消解这种冲突需要使用更强大的LR(1)分析法

上一篇 下一篇

猜你喜欢

热点阅读