求first集和follow集可参看这一篇https://blog.nowcoder.net/n/e3008adc558342548f349c9933198f3c
例题:试构造下述文法的SLR(1)分析表
G[E]:
E→E+T|T
T→F*|F
T→(E)|a
该文法能否构造LR(0)分析表?
Step 1 拓广文法
避免冲突,构建E'指向开始符E
推出两个的拆开写
(0)S'→E
(1)E→E+T
(2)E→T
(3)T→F*
(4)T→F
(5)F→(E)
(6)F→a
Step 2 列项目【项目集规范族(DFA图)】
点后面有东西的话- 如果是终结符【小写字母+符号:不能推出其他的】可以不管
- 如果非终结符,列出所有非终结符项目
更正:I5应为F→a·
Step 3 求 Follow集
FOLLOW(S‘)={#}
FOLLOW(E)={+,),#}
FOLLOW(T)={+,),#}
FOLLOW(F)={+,*,),#}
【点在后面的FOLLOW集】
I1:{+}∩FOLLOW(S’)=Φ
I3:{*}∩FOLLOW(T)=Φ
G[S]是SLR(1)文法
Step 4 SLR(1)分析表
- ACTION:终结符 【rx,以x产生式结束的(点在后面,找相同的拓广文法)&仅写FOLLOW集合中有的项;sx,到x项目集/状态】
- GOTO:非终结符
- 状态:项目集
- rx状态仅需填写在拓广文法x中左侧的开始项目的follow集中包含的元素的列即可
状态 |
ACTION【终结符】 |
GOTO |
|||||||
a | + | * | ( | ) | # | E |
T |
F | |
0 | S5 | S4 | 1 | 2 | 3 | ||||
1 | S6 | acc |
|
||||||
2 | r2 | r2 | r2 |
|
|||||
3 |
|
S7 | |||||||
4 | S5 | S4 | 8 | 2 | 3 | ||||
5 |
|
r6 | r6 |
|
r6 | r6 | |||
6 | S5 | S3 | S4 |
|
|
9 |
|
||
7 |
|
r3 | r3 | r3 |
|
|
|
||
8 |
|
S6 | S10 |
|
|
|
|||
9 |
|
r1 |
|
|
r1 | r1 |
|
|
|
10 |
|
r5 | r5 |
|
r5 | r5 |
|
|