12.2 LR(1) 分析法的要求

和 LR(0) 分析法相比, LR(1) 利用了 lookahead 的信息后,其解析力量和适用范围有了质的飞跃,一个状态中可以同时含有可折叠形态和不可折叠形态(只要可折叠形态的 lookahead 不和不可折叠形态中黑点后面的符号冲突),也可以同时含有多条可折叠形态(只要这些可折叠形态的 lookahead 不相互冲突)。

LR(1) 分析法对语法的要求为:

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

(2) 从此语法的起始状态开始生成的所有状态中:

(2.1) 任何一个状态不能同时含有 [ A -> u.aw , c ] 和 [ B -> v. , a ] ;

(2.2) 任何一个状态不能同时含有 [ A -> u. , a ] 和 [ B -> v. , a ] 。

以上的(2.1)将引起 shift/reduce 冲突,(2.2)将引起 reduce/reduce 冲突。一般语言的语法中很少会出现(2.2)的情况,而对于(2.1),在大部分情况下可以通过引入 优先级 来解决(见下一节)。

满足以上要求的语法被称为 LR(1) 语法,判断一个语法是否是 LR(1) 语法的方法就是构造其动作表,若构造过程中没有发现冲突,也就是表中的任何元素 M[I, X] 最多只有一个动作,那么此语法就是 LR(1) 语法。