11.3 LR(0) 分析法的要求

上一节中提到,可折叠状态中只含一条形态、且这条形态是可折叠形态,那存不存在这样的状态,里面既有可折叠形态、又有不可折叠形态,或者含多条不同的可折叠形态?即:

(1) 一个状态中,既含有形如 A -> u . v 的形态,也有形如 B -> w . 的形态;

(2) 一个状态中,既含有形如 A -> u . 的形态,也有形如 B -> w . 的形态。

显然,按上一节的定义,上面这两种状态都不是可折叠状态。如果语法分析过程有这种状态怎么办。

上面的第一种状态,会引起 shift/reduce冲突,也就是无法判断出应该 shift ,还是应该 reduce 。而第二种状态,则会引起 reduce/reduce冲突,也就是无法判断出应该采用那条产生式来折叠。

如果一个语法中,从起始状态开始生成的所有状态中,有以上两种状态,则这种语法就不能使用 LR(0) 法来进行分析,这就是 LR(0) 的限制条件。

我们将能使用 LR(0) 法进行分析的语法称为 LR(0) 语法, LR(0) 语法的要求为:

(1) 起始符号 S 不能位于任何产生式的右边;

(2) 从起始状态开始生成的所有状态中,如果一个状态中含有一条可折叠形态,那么这个状态中不能再含有任何其他形态。

到了这里,可以回答本章第一节最后提出来的第三、四个问题了:

怎么找出可行的折叠? 答案: 利用状态来寻找,当解析到可折叠状态时就可以发生折叠了,折叠应用的产生式就是该状态里面的那个形态的产生式。

如果有多个可行的折叠怎么办? 答案: 将语法改写为 LR(0) 语法。

上面最后一个问题的答案似乎不是个理想的答案,事实的确如此, LR(0) 语法的限制条件仍然相当之强,改写难度仍然很大,只能适用于简单的语法。我们需要一种更为强大、更为广泛的分析方法。

看起来似乎很令人气馁,我们花了这么大力气构造了一个如此复杂的 LR(0) 分析法,但却几乎不能用。不过,事实上,这个分析法距离我们的最终目标差一步之遥了。下一章中将介绍终极分析法 —— LR(1) 分析法。

第 11 章完