本文主要是介绍编译原理-求FOLLOW集合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
- 为什么需要求FIRST集合:因为一个产生式存在多个候选式,选择哪一个候选式是不确定的,所以这就产生了回溯。回溯需要消耗大量的计算、存储空间,所以我们需要消除回溯。而消除回溯的其中一种方法叫作“预测”,即根据栈顶非终结符去预测后面的候选式,那预测方法就是求第一个非终结符,来判断是否和读头匹配,以达到预测的效果
- 为什么需要求FOLLOW集合:求FOLLOW集合的目的和FIRST集合的目的是一样的,但是应该对的情形不一样,当出现了下列情形时,求FIRST集合已经达不到要求了
但是我们观察后发现,当F推出ε时,下面的E推出的a是能进行匹配的,在F这个位置求到a,就是在求FOLLOW集合
FOLLOW集合定义
文字定义:FOLLOW(A)集合是所有紧跟A之后的终结符或#所组成的集合(#是句尾的标志),称FOLLOW(A)是A的随符集
公式定义:
设G是上下文无关文法,A ∈ VN,S是开始符
则:
注意
- 当A是最右部的时候,# 加入 FOLLOE(A)
计算FOLLOW集合步骤
- 求解非终结符A的随符集FOLLOW(A)
- 1)对S,将 # 加入 FOLLOW(S),然后再按后面的处理
- 2)若B → αAβ是G的产生式,则将FIRST(β) - ε 加入FOLLOW(A)
- 3)若B → αA是G的产生式,或B → αAβ是G的产生式(β 多次推导后得到ε ),则将FOLLOW(B) 加入到FOLLOW(A) 【因为把B用αA替换之后,B后面紧跟的字符就是A后面紧跟的字符】
4)反复使用2)-3),直到FOLLOW集合不再增大为止
注意
- 这里的文法G必须是消除左递归且提取了左因子(点击查看提取左因子的办法)
例题
- 对如下文法G,E为开始符,求E、T、F的随符集
1.E → TE'
2.E' → +TE'
3.E' → ε
4.T → FT'
5.T' → *FT'
6.T' → ε
7.F → i
8.F → (E)
解:
---------------FOLLOW(E)---------------
FOLLOW(E) = {)} ; // 8. 规则2)
又 ∵ E是开始符,所以FOLLOW(E) = { #,) } ; // 规则1)---------------FOLLOW(T)---------------
FOLLOW(T) = FIRST(E') - ε; // 1. 规则2)
FIRST(E') = {+,ε}; // 2. 3.
当E' = ε时,E → TE' 就是 E → T,所以FOLLOW(E)也要加入FOLLOW(T),
∴ FOLLOW(T) = {+, #,)}
同理,FOLLOW(E')也需要加入到FOLLOW(T)中,
FOLLOW(E') = FOLLOW(E) = { #, )}; // 1. 规则3)
∴ FOLLOW(T) = {+, #,)}---------------FOLLOW(F)---------------
与FOLLOW(F)相关的式子有:
T' → *FT'
T → FT'先,T' → *FT'
∴ FOLLOW(F) = FIRST(T') - ε;
FIRST(T') = {*,ε}
当T'为ε时,也要把FOLLOW(T')加入FOLLOW(F)中,
FOLLOW(T') = {+, #,)},∴ FOLLOW(F) = {+,*, #,)}再,T → FT',
∴ FOLLOW(F) = FIRST(T') - ε;
当T'为ε时,也要把FOLLOW(T)加入FOLLOW(F)中,
∴ FOLLOW(F) = {+,*, #,)}
- 注
- 形如 T’ → *FT’,求FOLLOW(T’)时,针对本句,可以忽略3),因为是还是再求FOLLOW(T’)
- 对于产生了ε的,一定要记得3)
- FIRST求解的时候,关注点在左部,进行推导;FOLLOW求解的时候,关注点在右部,看跟随
其它
- 课件下载:
关注下方微信公众号,
回复:
FOLLOW.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top
这篇关于编译原理-求FOLLOW集合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!