设有如下文法G: <S>-→a<s><s>b <S>→→a<s><s><s> <S>→c (1)计算该文法的LR(0)项目集规范族,构造识别相应文法的所有规范句型活前缀的DFA。(2)该文法是LR(0)文法吗?若是,给出其LR(0)分析表。
时间: 2024-06-02 09:06:02 浏览: 292
(1)首先列出文法G的所有产生式的LR(0)项目:
```
S' -> ·S
S -> ·a<S><S>b
S -> ·a<S><S><S>
S -> ·c<S>
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
<S> -> ·c<S>
```
然后,构造出该文法的LR(0)项目集规范族:
```
I0:
S' -> ·S
S -> ·a<S><S>b
S -> ·a<S><S><S>
S -> ·c<S>
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
<S> -> ·c<S>
I1:
S' -> S·
I2:
S -> a<S>·<S>b
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
I3:
S -> a<S><S>·b
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
I4:
<S> -> a<S>·<S>b
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
I5:
<S> -> a<S><S>·<S>b
I6:
S -> c·<S>
I7:
<S> -> c·<S>
I8:
<S> -> a<S>·<S><b
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
I9:
<S> -> a<S><S>·<S><b
I10:
<S> -> a<S><S><S>·
I11:
<S> -> a<S>·<S><b
I12:
<S> -> c<S>·
I13:
<S> -> a<S><S>·
I14:
<S> -> ·c<S>
I15:
S -> a·<S><S>b
<S> -> ·a<S><S>b
<S> -> ·a<S><S><S>
I16:
<S> -> a·<S><S><S>
I17:
<S> -> a·<S><b
```
接下来,根据项目集规范族构造出识别相应文法的所有规范句型活前缀的DFA。DFA的状态集合即为项目集规范族,DFA的转移条件为当前状态在读入某个符号后转移到哪个状态。最终得到的DFA如下图所示:
![LR(0) DFA](https://img-blog.csdn.net/20180619150733509?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B1c2hpbmdfYmFuZ19sb3Zl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)
(2)为了判断该文法是否为LR(0)文法,需要检查其所有产生式右部的FIRST集和FOLLOW集是否存在交集。由于该文法的所有产生式右部不含ε,因此可以通过检查右部的FIRST集来判断是否存在规约-归约冲突。
对于文法G,可以得到其所有产生式右部的FIRST集如下:
```
FIRST(a) = {a}
FIRST(b) = {b}
FIRST(c) = {c}
FIRST(<S>) = {a, c}
```
从上述FIRST集可以看出,该文法不存在规约-归约冲突。因此,该文法是LR(0)文法。
下面给出该文法的LR(0)分析表:
| 状态 | a | b | c | S | <S> | $ |
| :--: | :-----: | :-----: | :-----: | :----: |
| 0 | s2 | | s6 | 1 | 5 | |
| 1 | s2 | | s6 | | 7 | acc |
| 2 | s2 | | s6 | 3 | 5 | |
| 3 | s2 | | s6 | | 4 | |
| 4 | | s8 | | | | |
| 5 | | | s6 | | 9 | |
| 6 | s2 | | s6 | | 7 | |
| 7 | | s10 | | | | |
| 8 | | | | | | r3 |
| 9 | | | s6 | | 11 | |
| 10 | | | | | | r1 |
| 11 | | s12 | | | | |
| 12 | | | | | | r2 |
其中,s表示移进操作,r表示规约操作,acc表示接受操作。
阅读全文