结构推理 请指出下面的LR分析表(a)、(b)和(c)分属LR(0)、SLR(1)和LR(1)中的哪一种?并说明理由。
   (a)
状态 ACTION GOTO
b # S B
0 S4   1 2
1   acc    
2 S5     5
3 r1      
4   r2    
5   r1    

   (b)
状态 ACTION GOTO
a b # T
0 S2 S4   1
1     acc  
2 S2 S4    
3 r1 r1 r1  
4 r2 r2 r2  

   (c)
状态 ACTION GOTO
1 k # P
0 S
2
S
4
  2
1     aC
C
 
2 S
2
S
4
   
3     r2  
4     r1  
【正确答案】LR(0)、SLR(1)和LR(1)分析表构造的主要差别在构造算法上。其区别如下:对LR(0)分析表来说,若项目A→α·属于Ik(状态),则对任何终结符a(包括结束符#),置ACTION[k,a]为“rj”,即用产生式A→α进行归约(j为产生式A→α的编号),所以在LR(0)分析表中,ACTION子表中行标为k的行全部填满“rj”,并且同一行的“rj”其下标j相同,而不同行的“rj”其下标不同。
   对SLR(0)分析表来说,若项目A→α·属于Ik,则对任何输入符号a,仅当a∈FOLLOW(A.时置ACTION[k,a]为“rj”,即用产生式A→α进行归约(j为产生式A→α的编号),所以在SLR(0)分析表中,ACTION子表中行标为k的行不一定全部填满“rj”,并且SLR(0)分析表中同一行的“rj”其下标j一定相同。
   对LR(1)来说,若项目[A→α·,a]属于Ik(状态),则置ACTION[k,a]为“用产生式A→α进行归约”,简记为“rj”。在LR(1)项目集规范族中假设有项目[A→α·,a]属于Ik(状态),此时应该置ACTION[k,a]为rj(A→α为第j个产生式),同时也可能出现项目[A→α·,b]属于Im(状态),此时也应该置ACTION[m,b]为rj。所以在LR(1)分析表的ACTION子表中,不同的行(即不同的状态)里可能会出现相同的rj,而在同一行也可能出现不同的rj
   所以,上面的(a)分析表为LR(1)分析表(在不同行有相同的r2存在);(b)为LR(0)分析表(有rj的行是每行都填满了rj且同一行rj的j相同,不同行rj的j不同);而(c)为SLR分析表(存在并不全部填满rj的行,且不同行rj的j不同)。
【答案解析】