博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
总结 编译原理 (FIRST集和FOLLOW集和select集)
阅读量:3948 次
发布时间:2019-05-24

本文共 2355 字,大约阅读时间需要 7 分钟。

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


文章目录

  • ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200129163341581.png )

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 完美

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

转载地址:http://aaqwi.baihongyu.com/

你可能感兴趣的文章
Android中打印代码的调用层次
查看>>
成功者十三个价值连城的习惯
查看>>
特别成功的人会做6件事
查看>>
Android: 用jni 获取MAC地址
查看>>
字符串列表的C语言实现:c_strlist
查看>>
客户沟通的方式:礼貌待客沟通方式,技巧推广沟通方式,个性服务沟通方式
查看>>
用弹性工作制留住员工
查看>>
知识=经验×反思2
查看>>
领导者如何发现关键问题
查看>>
学习无为领导力
查看>>
卓越领导看过程
查看>>
领导力与各种循环挑战
查看>>
达成谈判协议 - 避免操之过急
查看>>
销售人说话“十大忌”
查看>>
营销中的“战略非对称”
查看>>
android 如何开关Mediatek开发的Feature
查看>>
Android电话功能各部分深入探讨
查看>>
Android应用技巧总结
查看>>
Android创建sdcard详细图解
查看>>
Android开发:如何实现TCP和UDP传输
查看>>