总结 编译原理 (FIRST集和FOLLOW集和select集)

本文深入解析编译原理中的FIRST、FOLLOW及SELECT集概念,通过实例详细阐述如何计算这些集合,为自顶向下分析提供关键指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先这是我 看了一下午 搜了好多视频好不容易总结的(也是好不容易看懂的o(╥﹏╥)o)


1、写在前面:

首先要知道什么是终结符,什么是非终结符

  1. 我理解的就是 可以再向下分解的就是非终结符(例如:T B A…之类的) 反之不可以继续分解的就是终结符(例如:a b c ‘(‘ ’) ’ [ ’ ’ ] ’ )
  2. 也可以说 大写字母是非终结符 可以继续分解的
    而 终结符是 小写字母 或者是 一些符号 不可以分解的

例题:
在这里插入图片描述

2、*FIRST集

我觉得直接上题开始讲解才是很容易理解的
反正这是我自己的总结 防止我以后忘接了 嘻嘻(# ^ . ^#)

. 首先根据给定的文法
1. E —> T E ’
2. E ’ —> + T E ’ | ε
3. T —> F T ’
4. T ’ —> * F T ’ | ε
5. F —> (E) | id

首先从E开始 开始都有一个# 或 $(我也不知道是哪个 看到好几个版本蒙了 我就用 $ 吧 代表结束符)

(读者首先应注意到用作标记输入结束的“ #”,它就像是 Foll ow 集合计算中的一个记号。若没有它,那么在整个被匹配的串之后就没有符号了。由于这样的串是由文法的开始符号生成的,所以#必须总是要增加到开始符号的 Follow 集合中。)
在给定的文法中按照顺数来依次找 找给定产生式的第一个终结符依次向下找,因为找的是首符集(first)

FIRST(E)= { $ }
1.E —> T E ’ ----------> 3. T —> F T '----->5. F —> ( E ) | id
所以FIRST(E)= { (,id }
2.E ’ —> + T E ’ | ε—因为开始就是终结符
所以FIRST(E ')= { + , ε }
3.T —> F T '------>5. F —> ( E ) | id
所以FIRST( T )= { (,id }
4.T ’ —> * F T ’ | ε------因为开始就是终结符
所以FIRST( T ’ )= { * ,ε }
6. F —> ( E ) | id-----因为开始就是终结符
所以FIRST( F )= { ( ,id }

这就是我总结的first集的写法


3、FOLLOW集

follow集呢其实有一个算法 刚开始你可能看不懂 不是道什么意思 但是当你真正明白的时候 你会发现他说的都是对的-----难顶呀!

算法

集合 Follow (A) 的定义如下:
(1)若 A 是开始符号,则#就在 Follow (A) 中。
(2)若存在产生式B →aAg ,则First (g) - {ε }在 Follow (A) 中。
(3)若存在产生式B →aAg ,且ε在 First (g) 中,则 Follow (A)包括 Follow (B)。

没错所有的精华就在这几句话中


在这里插入图片描述
(这是刚才的题 我再拿过来 上下翻麻烦)
一定要耐心的看这几句话 我写的很认真的 你认真看一定能明白的!加油ヾ(◍°∇°◍)ノ゙。

1. 首先看开始符E 默认开始符E的 follow集中存在$(#)结束符 然后在产生式的右部分找有没有E了,然后看见5中有E ,E后面的是终结符 ')' 所以就加在FOLLOW(E)={ $ , ) }中
2. 再看E' ,在文法的右部分找有E'的产生式 找到1和2 因为E'是句型的最右符号 所以follow(E') 包括follow(E) 所以follow(E') ={ $ , ) } 和E一样
3. 再看T,在文法的右部分找有T的产生式 找到1和2,因为T后面是E',又因为E' 的first集是{+,ε } ,所以可以是+或ε首先+可以 放在follow(T)集中,然后又因为E'可能是ε 空产生式,所以follow(T)包括follow(E)所以将{ $ , ) }放在follow(T)集中所以follow(T)={+, $ , ) }
4. 再看T' , 在文法的右部分找有T'的产生式,找到3和4,因为T'是句型的最右符号,所以follow(T') 包括follow(T)所以follow(T') ={ +, $ , ) } 和T一样
5. 最后看F,在文法的右部分找有F的产生式,找到3和4,因为F后面是T',而T'的首符集(follow集)是{*,ε }所以 ‘ * ’放在follow(F)集中,然后T'还有可能是空产生式ε,所以follow(F)包括follow(T)所以将{+, $ , ) }放在follow(T)集中,所以最后follow(F) ={ *,+, $ , ) }

啊啊啊好累啊 一个一个字码的! 自己写的自己应该能看懂 嘻嘻


4、为什么要引入follow集

在这里插入图片描述
这一句帮助理解为什么要引入follow集 要知道前因后果
因为在自顶向下的分析过程中 如果当某一非终结符(A)的产生式中含有空产生式ε时(如:A—>ε)则找不到继续向下的式子了,但是呢之后的S式子中有我们要找的终结符d 由此我们引入了follow集,用来找寻因为空产生式ε所造成的问题。因此,引入了一个文法符号的后跟符号集合follow集。

5. 这是这道题的SELECT集

在这里插入图片描述
first集和follow集理解了 select集看图就很容易理解了

  • 将文法的合起来的产生式都分开变成单独的一条
  • 没有遇到ε空产生式的就用对应的first集
  • 遇到ε空产生式就用对应的follow集
  • ok 完美

看到最后的帮忙点个👍🙏 谢谢!
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴走的山交

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值