首先构造该文法G′的识别活前缀的DFA如图7.9。
也可先构造该文法G′的LR(0)项目集规范族如表7.5。
表 7.5 G′的LR(0)项目集族 |
状态 |
核集合 |
闭包增加项目 |
项目集 |
I0 |
S′→·S. |
S→·rD.. |
S′→·S..
S→·rD... |
I1 |
S′→S·. |
 |
S′→S·.. |
I2 |
S→r·D.. |
D→·D,i
D→·i... |
S→r·D...
D→·D,i.
D→·i.... |
I3 |
S→rD·..
D→D·,i |
 |
S→rD·...
D→D·,i. |
I4 |
D→i·... |
 |
D→i·.... |
I5 |
D→D,·i |
 |
D→D,·i. |
I6 |
D→D,i· |
 |
D→D,i·. |
|
然后再用GO函数构造图 7.9 识别文法G′活前缀的DFA。
分析每个状态包含的项目集,不难发现在状态I3中含项目:
S→rD· 为归约项目
D→D·,i 为移进项目
也就是按S→rD·项目的动作认为用S→rD产生式进行归约的句柄已形成,不管当前的输入符号是什么,都应把rD归约成S。但是按D→D·,i项目当面临输入符为','号时,应将','号移入符号栈,状态转向I5。显然该文法不是LR(0)文法,也可在构造它的LR(0)分析表时发现这个问题,如表7.6所示。
表7.6 实数说明文法的LR(0)分析表
|
状态 |
ACTION |
GOTO |
r |
, |
i |
# |
S |
D |
0
1
2
3
4
5
6 |
S2
.
.
r1
r3
.
r2 |
.
.
.
r1, S5
r3
.
r2 |
.
.
S4
r1
r3
S6
r2 |
.
acc
.
r1
r3
.
r2 |
1 |
.
.
3 |
|
|