表>,) ; POP, NEXTSYM int POP, NEXTSYM float char ID POP, NEXTSYM POP, NEXTSYM POP, NEXTSYM , POP, NEXTSYM # ACCEPT , # 更常用且简单的LL(1)分析表: <声明语句> <类型> <变量表> ; int <声明语句>→<类型><变量表>; <类型>→int float <声明语句>→<类型><变量表>; <类型>→float char <声明语句>→<类型><变量表>; <类型>→char ID <变量表>→ID<变量表1> <变量表1> <变量表1>→ε <变量表1>→,<变量表> (5) 输入串“char x,y,z;”相对应的LL(1)分析过程如下: 步骤 1 分析栈 #<声明语句> 余留输入串 分析表元素 所用产生式 <声明语句>→<类型><变量表>; <类型>→char char x,y,z;# POP , PUSH(;<变量表><类型>) char x,y,z;# POP , PUSH(char) 2 3 #;<变量表><类型> #;<变量表> char x,y,z;# POP, char NEXTSYM
4 #;<变量表> x,y,z;# POP , PUSH(<变量表1>ID) POP, NEXTSYM POP , PUSH(<变表>,) POP, NEXTSYM POP , PUSH(<变量表1>ID) POP, NEXTSYM POP , PUSH(<变表>,) POP, NEXTSYM POP , PUSH(<变量表1>ID) POP, NEXTSYM POP POP, NEXTSYM ACCEPT 量量<变量表>→ID<变量表1> <变量表1>→,<变量表> <变量表>→ID<变量表1> <变量表1>→,<变量表> <变量表>→ID<变量表1> <变量表1>→ε 5 6 #;<变量表1>x x,y,z;# #;<变量表1> ,y,z;# 7 8 #;<变量表>, #;<变量表> ,y,z;# y,z;# 9 10 #;<变量表1>y y,z;# #;<变量表1> ,z;# 11 12 #;<变量表>, #;<变量表> ,z;# z;# 13 14 15 16
#;<变量表1>z z;# #;<变量表1> #; # ;# ;# #
5.1 考虑以下的文法: S→S;T|T T→a
(1) 为这个文法构造LR(0)的项目集规范族。
(2) 这个文法是不是LR(0)文法?如果是,则构造LR(0)分析表。 (3) 对输入串“a;a”进行分析。 解:
(1)拓广文法G[S’]: 0:S’→S 1:S→S;T 2:S→T 3:T→a
构造LR(0)项目集规范族 状态 0 项目集 S’→·S S→·S;T S→·T T→·a S’→S· S→S·;T S→T· T→a· S→S;·T T→·a S→S;T· 转换函数 GO[0,S]=1 GO[0,S]=1 GO[0,T]=2 GO[0,a]=3 ACCEPT GO[1,;]=4 R2 R3 GO[4,T]=5 GO[4,a]=3 R1 1 2 3 4 5
(2)该文法不存在“归约-归约”和“归约-移进”冲突,因此是LR(0)文法。LR(0)分析表如下: 状态 0 ACTION ; a S3 # S 1 GOTO T 2
1 2 3 4 5 S4 R2 R3 R1 R2 R3 S3 R1 ACCEPT R2 R3 R1 5
(3)对输入串“a;a”进行分析如下: 步骤 0 1 3 4 5 6 7 8 状态栈 0 03 02 01 014 0143 0145 01 符号栈 # #a #T #S #S; #S;a #S;T #S 输入符号栈 ACTION a;a# ;a# ;a# ;a# a# # # # S3 R3 R2 S4 S3 R3 R1 ACCEPT GOTO 2 1 5 1
5.2 证明下面文法是SLR(1)文法,但不是LR(0)文法。 S→A
A→Ab|bBa B→aAc|a|aAb 解:文法G[S]: 0:S→A 1:A→Ab 2:A→bBa 3:B→aAc 4:B→a 5:B→aAb
构造LR(0)项目集规范族: 状态 0 项目集 S→·A A→·Ab A→·bBa S→A· A→A·b A→b·Ba B→·aAc B→·a B→·aAb A→Ab· A→bB·a 转换函数 GO[0,A]=1 GO[0,A]=1 GO[0,b]=2 ACCEPT GO[1,b]=3 GO[2,B]=4 GO[2,a]=5 GO[2,a]=5 GO[2,a]=5 R1 GO[4,a]=6 1 2 3 4
5 B→a·Ac B→a· B→a·Ab A→·Ab A→·bBa A→bBa· B→aA·c B→aA·b A→A·b B→aAc· B→aAb· A→Ab· GO[5,A]=7 R4 GO[5,A]=7 GO[5,A]=7 GO[5,b]=2 R2 GO[7,c]=8 GO[7,b]=9 GO[7,b]=9 R3 R5 R1 6 7 8 9 状态5存在“归约-移进”冲突,状态9存在“归约-归约”冲突,因此该文法不是LR(0)文法。 状态5:
FOLLOW(B)={a},因此,FOLLOW(B)∩{b}=Φ 状态9:
FOLLOW(B)={a},FOLLOW(A)={#,b,c},因此FOLLOW(B)∩FOLLOW(A)=Φ 状态5和状态9的冲突均可用SLR(1)方法解决,构造SLR(1)分析表如下: 状态 0 1 2 3 4 5 6 7 8 9 ACTION a S5 S6 R4 R3 R5 R1 b S2 S3 R1 S2 R2 S9 c R1 R2 S8 R1 R1 # ACCEPT R1 R2 A 1 7 GOTO B 4 该SLR(1)分析表无重定义,因此该文法是SLR(1)文法,不是LR(0)文法。
5.3 证明下面文法是LR(1)文法,但不是SLR(1)文法。 S→AaAb|BbBa A→ε B→ε
解:拓广文法G[S’]: 0:S’→S 1:S→AaAb 2:S→BbBa 3:A→ε 4:B→ε