本文共 2355 字,大约阅读时间需要 7 分钟。
首先这是我 看了一下午 搜了好多视频好不容易总结的(也是好不容易看懂的o(╥﹏╥)o)
文章目录
-
-
-
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200129163341581.png )
1、写在前面:
首先要知道什么是终结符,什么是非终结符
- 我理解的就是 可以再向下分解的就是非终结符(例如:T B A…之类的) 反之不可以继续分解的就是终结符(例如:a b c ‘(‘ ’) ’ [ ’ ’ ] ’ )
- 也可以说 大写字母是非终结符 可以继续分解的 而 终结符是 小写字母 或者是 一些符号 不可以分解的
例题:
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/