下面文法不是LR(1 )的,对它略作修改,使之成为一个等价的 SLR(1)文法。 PROCRAM-begin DECLIST semicolon STATELIST end DECLIST-* d semicolon DECLIST I d STATELIST-* s semicolon STATELIST I s
时间: 2024-01-24 22:19:21 浏览: 123
首先,将文法符号化简为如下形式:
S -> begin D ; L end
D -> D ; I d | ε
L -> L ; I s | ε
接着,构造 SLR(1) 分析表:
| | d | s | ; | I | $ | begin | end | D | L |
|----|-----|-----|-----|-----|-----|-------|-----|-----|-----|
| 0 | s4 | s5 | | s2 | | s1 | | g3 | g6 |
| 1 | | | | | acc | | | | |
| 2 | s4 | s5 | | s2 | | | | g7 | g6 |
| 3 | | | | | r1 | | r1 | | |
| 4 | | | s8 | | | | | | |
| 5 | | | s9 | | | | | | |
| 6 | | | | | r2 | | r2 | | |
| 7 | | | r3 | | r3 | | r3 | | |
| 8 | s4 | s5 | | s2 | | | | g10 | g6 |
| 9 | s4 | s5 | | s2 | | | | g11 | g6 |
| 10 | | | r4 | | r4 | | r4 | | |
| 11 | | | r5 | | r5 | | r5 | | |
其中,s 表示移进,r 表示规约,g 表示转移。$ 表示输入结束符。
可以看到,上述 SLR(1) 分析表存在移进-规约冲突。具体来说,状态 0 中遇到一个 I 时,既可以移进,也可以使用规约 D -> ε。因此,我们需要修改文法,消除这个冲突。
可以发现,冲突的原因是 D 可以推出 ε。因此,我们可以将 D 改为 D',并添加产生式 D' -> D | ε,使得 D' 不再能够推出 ε。
修改后的文法如下:
S -> begin D ; L end
D' -> D | ε
D -> D ; I d
L -> L ; I s | ε
重新构造 SLR(1) 分析表:
| | d | s | ; | I | $ | begin | end | D' | D | L |
|----|-----|-----|-----|-----|-----|-------|-----|-----|-----|-----|
| 0 | s4 | s5 | | s2 | | s1 | | g3 | g6 | |
| 1 | | | | | acc | | | | | |
| 2 | s4 | s5 | | s2 | | | | g7 | g6 | |
| 3 | | | | | r1 | | r1 | | | |
| 4 | | | s8 | | | | | | | |
| 5 | | | s9 | | | | | | | |
| 6 | | | | | r2 | | r2 | | | |
| 7 | | | r3 | | r3 | | r3 | | | |
| 8 | s4 | s5 | | s2 | | | | g10 | g6 | |
| 9 | s4 | s5 | | s2 | | | | g11 | g6 | |
| 10 | | | r4 | | r4 | | r4 | | | |
| 11 | | | r5 | | r5 | | r5 | | | |
可以看到,修改后的文法不再存在移进-规约冲突,且仍能识别与原文法相同的语言。因此,我们成功地将原文法转化为了 SLR(1) 形式。
阅读全文