求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