写在前面
这学期在上《编译原理》这门课程,学到FIRST和FOLLOW集的求解时觉得老师给的方法虽然直观,但是看不到尽头,对于我这种容易粗心的人而言反复的检查演算就是一种折磨
龙书中对FIRST和FOLLOW集的求解方法
P
140
∼
P
141
P_{140} \sim P_{141}
P140∼P141
先上例题:
A
→
B
C
c
∣
g
D
B
A\rightarrow BCc \ | \ gDB
A→BCc ∣ gDB
B
→
b
C
D
E
∣
ϵ
B\rightarrow bCDE \ | \ \epsilon
B→bCDE ∣ ϵ
C
→
D
a
B
∣
c
a
C\rightarrow DaB \ | \ ca
C→DaB ∣ ca
D
→
d
D
∣
ϵ
D\rightarrow dD \ | \ \epsilon
D→dD ∣ ϵ
E
→
g
A
f
∣
c
E\rightarrow gAf \ | \ c
E→gAf ∣ c
求预测表。
我的思路
核心思想:记录下非终结符之间的关系,然后根据拓扑排序来实现完备的补充。
下面先求FIRST,然后求FOLLOW,有了前面两个表之后,SELECT表就很容易了。
I. FIRST求解
这里需要有两个表:
- 空表,用来记录哪些符号是可空的。
- first表:用来记录非终结符之间的first关系。 A A A是 B B B的儿子表示A的first内容要补充到B中
a. 首先扫描一遍得到哪些符号是可空的
空表: B , D B,D B,D
b. 然后再扫描一遍结合空表可以得到first关系表和未补充的FIRST表
first表:
父 | 子 |
---|---|
A | B,C |
B | |
C | D |
D | |
E |
未补充的FIRST表:
FIRST | |
---|---|
A | g |
B | b. ϵ \epsilon ϵ |
C | a,c |
D | d, ϵ \epsilon ϵ |
E | g,c |
c.用first表对FIRST表进行补充
first表的拓扑图
因此我们可以使用任一拓扑排序,不妨为DCBA。可得补充后的FIRST表。
补充后的FIRST表(这里需要补充内容不包括 ϵ \epsilon ϵ)
FIRST | |
---|---|
A | g a,c,d(from C) b(from B) |
B | b. ϵ \epsilon ϵ |
C | a,c d(from D) |
D | d, ϵ \epsilon ϵ |
E | g,c |
II. FOLLOW集
这里我们也需要用到两个表:
- 空表
- follow表,功能与first表相同。
a. 空表可复用
空表: B , D B,D B,D
b. 扫描一遍结合空表可以得到follow关系表和未补充的FOLLOW表
follow表
父 | 子 |
---|---|
A | |
B | A,C |
C | |
D | A |
E | B |
未补充的FOLLOW表:
FOLLOW | |
---|---|
A | $,f |
B | a,c,d |
C | d c,g |
D | b,g,c,a |
E |
c.用follow表对FOLLOW表进行补充
follow表的拓扑图
任取一拓扑排序 CADBE,可得补充后的FOLLOW表
FOLLOW | |
---|---|
A | $,f |
B | a,c,d g(from C) $,f(from A) |
C | d c,g |
D | b,g,c,a $,f(from A) |
E | a,c,d,g,$,f(from B) |