24、试构造文法的LR(1)分析表 (1) SL=R (2) SR (3) L*R (4) Lid (5) RL
时间: 2023-11-13 17:05:22 浏览: 44
首先,我们需要对文法进行拓广,加入一个新的起始符号 S',并添加一条新的产生式 S'->S。得到的文法如下:
```
0. S' -> S
1. S -> SL=R
2. S -> SR
3. S -> L*R
4. S -> Lid
5. S -> RL
6. L -> *
7. R -> id
```
接下来我们需要构造 LR(1) 分析表。首先,我们需要构造每个状态的 LR(1) 项集。
状态 0(初始状态):
```
S' -> .S, $
S -> .SL=R, $
S -> .SR, $
S -> .L*R, $
S -> .Lid, $
S -> .RL, $
L -> .*, =, $
R -> .id, *, =, $
```
状态 1:
```
S' -> S., $
```
状态 2:
```
S -> SR., $
```
状态 3:
```
S -> L*.R, $
R -> .id, =, $
```
状态 4:
```
S -> Li.d, *
```
状态 5:
```
S -> R.L, $
```
状态 6:
```
S -> L*.R, =, $
R -> i.d, *, =, $
```
状态 7:
```
S -> L*R., $
```
状态 8:
```
S -> SL*=R, $
L -> *., =, $
R -> .id, =, $
```
状态 9:
```
S -> SL*=R, $
L -> *.R, =, $
R -> .id, =, $
```
状态 10:
```
S -> L*R., =, $
```
状态 11:
```
S -> SL*=R, =, $
L -> *., =, $
R -> i.d, *, =, $
```
状态 12:
```
S -> L*.R, *, $
R -> .id, =, $
```
状态 13:
```
S -> L*.R, =, $
R -> i.d, *, =, $
```
状态 14:
```
S -> SL*=R., $
L -> *., =, $
R -> .id, =, $
```
状态 15:
```
S -> L*.R, *, =, $
R -> i.d, *, =, $
```
下面是构造出的 LR(1) 分析表:
| 状态 | action | goto |
| :--------: | :---------------: | :-------------: |
| 0 | s3, s4, s5, s6 | 1, 2 |
| 1 | acc | |
| 2 | s3, s4, s5, s6 | 7 |
| 3 | r7, r7, r7, s8 | |
| 4 | r4 | |
| 5 | r5 | |
| 6 | r6, s4, s5, s6 | |
| 7 | s9, s4, s5, s6 | 10 |
| 8 | s3, s4, s5, s6 | 11 |
| 9 | r7, r7, r7, s12 | |
| 10 | r3 | |
| 11 | r6, s4, s5, s6 | 13 |
| 12 | r7, s4, s5, s6 | |
| 13 | r7, r7, r7, s14 | |
| 14 | r7, r7, r7, s15 | |
| 15 | r7, r7, r7, s12 | |
其中:
- action 表示在该状态下,接收到某个终结符时应该进行的操作。s 表示移入,r 表示规约,acc 表示接受。
- goto 表示在该状态下,接收到某个非终结符时应该转移到的状态。如果没有转移,则为空。