证明LR分析过程正确性的一个重要引理:由构造LR(0)项目集规范族得到的DFA,它可以也只能读进所分析文法的活前缀。
需要证明两个方面:
命题1 所有活前缀一定都可由DFA读进,即不会错过合法的归约。
命题2 DFA只能读活前缀。
证明思路:
首先要了解活前缀是如何产生的。活前缀的集合Prefix可归纳定义如下:
设S’是增广文法的开始符号,既有产生式S’ ( S(S是原文法的开始符号),令S (Prefix。
若v (Prefix,则v的任一前缀u都是活前缀,即u(Prefix。
若v (Prefix,且v中至少包含一个非终结符,即可以将v写成 (B(,其中B为非终结符。若有产生式B ( β,则(β的任一前缀u都是活前缀,即u(Prefix。
Prefix中的元素只能通过上述步骤产生。
命题1可以根据Prefix的定义进行归纳证明。
基础:对于由规则(1)产生的活前缀S (Prefix,由于在DFA的初始项目集(状态)I0中含有项目S’ (? S,显然S是可以被DFA读进的。
归纳:若v (Prefix,且v可以被DFA读进,则v的前缀可以被DFA读进也是显然的。
若v (Prefix,且可以将v写成 (B(,其中B为非终结符并有产生式B ( β。设DFA在从初态I0读进 ( 后进入状态I。因为v=(B( 可以被DFA读进,所以在状态I可以读进B,根据DFA的构造过程,一定存在项目C ( (? B ( ’ (I。由闭包的计算过程,可知一定有B (? β (I,因此β是从I开始后续的可读串。所以,从初态I0开始,(β的任一前缀u都是可读进的。
命题1证毕。
命题2可归纳于DFA可读序列的长度n来证明。
基础:n=0。显然空序列ε是活前缀。
归纳:设 (X 是DFA可读序列,且((X (= n +1,其中X是某个文法符号。在读过 ( 后,DFA一定处于状态I,在此状态下X是可读的。根据DFA的构造过程,一定存在项目C (β? X ( (I。该项目或者是基本项目,或者是通过闭包计算得到的项目。下面分这两种情形来讨论。
1) C (β? X ( 是基本项目。
若(β(= 0,则该项目只能是S’ (? S,此时(X = S显然是活前缀。
若(β(= m ≠ 0,则DFA从状态I0读进n - m个符号的序列μ后进入状态I’,且必定有C (? βX ( (I’。 根据DFA的构造过程,一定存在项目B (? C ( ’ ( I’。这样在状态I’下,可以读进B。因为(μB(≤n,由归纳假设,可知μB是活前缀。因此,由活前缀集合的归纳定义,得知μβX = (X是活前缀。
2) C (β? X ( 是通过闭包计算得到的项目。
此时,β一定为空序列,而项目C (? X (一定是由I中的某个基本项目B ( μ? C0 ( 直接或间接地通过闭包计算序列得到的:C0 (? C1 (1,C1 (? C2 (2,(,Ck (? C (k+1。由1)的讨论结果,可知 ( C0 是活前缀。从而 (C1,(C2,(,(Ck 都是或前缀,(C 也是活前缀。所以,(X是活前缀。
命题2证毕。
(如发现问题,请指正)