一种基于“空间换时间”的求FIRST集和FOLLOW集的方法

本文介绍了在《编译原理》课程中,作者针对FIRST集和FOLLOW集的求解提出了一种基于“空间换时间”的优化方法。通过记录非终结符之间的关系,利用拓扑排序进行完备补充,从而提高计算效率,减少检查和演算的错误。
摘要由CSDN通过智能技术生成

写在前面

这学期在上《编译原理》这门课程,学到FIRST和FOLLOW集的求解时觉得老师给的方法虽然直观,但是看不到尽头,对于我这种容易粗心的人而言反复的检查演算就是一种折磨

龙书中对FIRST和FOLLOW集的求解方法
P 140 ∼ P 141 P_{140} \sim P_{141} P140P141

先上例题

A → B C c   ∣   g D B A\rightarrow BCc \ | \ gDB ABCc  gDB
B → b C D E   ∣   ϵ B\rightarrow bCDE \ | \ \epsilon BbCDE  ϵ
C → D a B   ∣   c a C\rightarrow DaB \ | \ ca CDaB  ca
D → d D   ∣   ϵ D\rightarrow dD \ | \ \epsilon DdD  ϵ
E → g A f   ∣   c E\rightarrow gAf \ | \ c EgAf  c
求预测表。

我的思路

核心思想:记录下非终结符之间的关系,然后根据拓扑排序来实现完备的补充。
下面先求FIRST,然后求FOLLOW,有了前面两个表之后,SELECT表就很容易了。

I. FIRST求解

这里需要有两个表:

  1. 空表,用来记录哪些符号是可空的。
  2. first表:用来记录非终结符之间的first关系。 A A A B B B的儿子表示A的first内容要补充到B中
a. 首先扫描一遍得到哪些符号是可空的

空表: B , D B,D B,D

b. 然后再扫描一遍结合空表可以得到first关系表和未补充的FIRST表

first表:

AB,C
B
CD
D
E

未补充的FIRST表:

FIRST
Ag
Bb. ϵ \epsilon ϵ
Ca,c
Dd, ϵ \epsilon ϵ
Eg,c
c.用first表对FIRST表进行补充

first表的拓扑图

D
C
B
A

因此我们可以使用任一拓扑排序,不妨为DCBA。可得补充后的FIRST表。

补充后的FIRST表(这里需要补充内容不包括 ϵ \epsilon ϵ)

FIRST
Ag a,c,d(from C) b(from B)
Bb. ϵ \epsilon ϵ
Ca,c d(from D)
Dd, ϵ \epsilon ϵ
Eg,c
II. FOLLOW集

这里我们也需要用到两个表:

  1. 空表
  2. follow表,功能与first表相同。
a. 空表可复用

空表: B , D B,D B,D

b. 扫描一遍结合空表可以得到follow关系表和未补充的FOLLOW表

follow表

A
BA,C
C
DA
EB

未补充的FOLLOW表:

FOLLOW
A$,f
Ba,c,d
Cd c,g
Db,g,c,a
E
c.用follow表对FOLLOW表进行补充

follow表的拓扑图

A
B
C
D
E

任取一拓扑排序 CADBE,可得补充后的FOLLOW表

FOLLOW
A$,f
Ba,c,d g(from C) $,f(from A)
Cd c,g
Db,g,c,a $,f(from A)
Ea,c,d,g,$,f(from B)

综上,经过这些流程,我们可以确定得到的结果是完备的。与龙书上的做法相比,我们根据表的结果来进行精确的剪枝,从而提高了计算效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值