上一节讲完了SLR(LL(0)改进算法)的由来, 我们来大致分析一下该算法的基本思想...
具体我们可以再来看一个冲突...
可以看到状态2中, 既可以移进也可以归约, 同时由于R的follow集中也存在=(R可以是L, L后面可以是=), 所以两种情况都无法避免...
为了解决这个冲突, 我们引出LR(1), 这里可能有会有点跳跃 :
其实a(不是希腊子母)指的某一个或者某几个终结符...这个a只可能小于或者等于X的follow集, 至于原因, 我也解释不清...但这也是为什么LR(1)要比SLR更加准确...来看一个实际的例子 :
仔细感受一下应该不难理解...
同时我们继续来看另外一个例子 :
会看到5, 11 或者8 10, 这两个状态差异不大, 可以合并, 但合并之后可能导致状态表分析不准确, 这里就是一个空间和准确度的权衡了.修改之后的算法就是LALR分析算法...
其核心思想在于在不改变分析表准确度的情况下尽可能的对LR(1)分析表进行压缩...