first集合follow集的求法
FIRST集的定义 :
设G=(VT,VN,P,S)是上下文无关文法
FIRST(a)={a|a=>*ab,a∈VT, a,b∈V*}
若a=>*ε则规定ε∈FIRST (a)
FIRST(α)就是从α可能推导出的所有开头终结符号和可能的ε所构成的集合。
FIRST集的分析方法 :
对于文法中的符号X∈VN∪VT,其FIRST(X)集合可反复应用下列规则计算,直到其FIRST(X)集合不再增大为止:
1)若 X∈VT,则FIRST(X)={X}。
2)若X∈VN,且具有形如X→aα的产生式(a∈VT),或具有形如X→ε的产生式,则把a或ε加进FIRST(X)。//把X能推出的第一个终结符加入FIRST(X)。
3) 设G中有形如X→Y1…Yk的产生式,其中X,Y1…Yk∈VN,且Y1…Yi-1均能=>*ε(1≤i≤k),则FIRST(Y1)-{ε},…, FIRST(Yi-1)-{ε},FIRST(Yi)都包含在FIRST(X)中。// Yi推导不出ε,所以Yi+1不在FIRST(X)中。
4) 若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。//若X=>*ε,则将ε加入FIRST(X)。
FIRST集的求法:
对于文法G的任一符号串α=X1X2…Xn可按下列步骤构造其FIRST(α)集合:
1) 置FIRST(α)=φ
2) 将FIRST(X1)中的一切非ε符号加进FIRST(α);
3) 若ε∈FIRST(X1),将FIRST(X2)中的一切非ε符号加进FIRST(α);若ε∈FIRST(X1)和FIRST(X2),将FIRST(X3)中的一切非ε符号加进FIRST(α);依次类推。//根据分析方法中的第3条,若该符号能推出ε则将下一个符号的FIRST集加入FIRST(α),以此类推。
4)若对于一切1≤i≤n,ε∈FIRST(Xi),则将ε符号加进FIRST(α)。 //根据分析方法的第4条,若右侧符号串的每个符号都能推出ε,则α肯定能推出ε,所以将ε加进FIRST(α)。
例:
E →TE’
E’→+TE’
E’→ε
T →FT’
T’→*FT’
T’→ε
F→(E)|i
FIRST(E)=FIRST(T)=FIRST(F)={ ( ,i } //FIRST(T)不包含ε,所以FIRST(E)不包含FIRST(E’),根据求法的第3条,T无法推出ε为向右类推的终止条件。同理:FIRST(T)不包含FIRST(T’)。
FIRST(E’)= { + ,ε}
FIRST(T’)={ * ,ε}
//遇到E →TE’这样的产生式,先把FISRT(T)放入FIRST(E),再看看T能否推导出ε,若能推出,则把FIRST(E’)放入FIRST(E),以此类推。
若T不能推出ε,则FIRST(E)求完了。若遇到终结符,请看分析方法第一条。
FOLLOW集定义
FOLLOW(A)={a| S=>*mAb 且a∈FIRST(b),m∈V*,b∈V+}
若 S=>*uAb, 且b =>*ε,则#∈FOLLOW( A)。
FOLLOW集的计算
1. 对于文法的开始符号S,置#于FOLLOW(S) 中;
2. 若A→αBβ是一个产生式,则把FIRST(β)-{e}加至FOLLOW(B)中;若β=>*e (即eÎFIRST(β)),则把FOLLOW(A)加至FOLLOW(B)中。//若B有可能是最后一个符号,则把
FOLLOW(A)加至FOLLOW(B)中,否则把FIRST(β)- {e}加至FOLLOW(B)中。
反复使用上述规则,直到所求FOLLOW集不再增大为止。
注意: 在FOLLOW集合中无ε。
//FIRST集从产生式左侧推导,而FOLLOW集从产生式右侧推导。例如求A的FIRST集,要先从产生式左侧找到A,然后根据产生式右侧的信息求出A的FIRST集;求A的FOLLOW集时,要先从产生式右侧找到A,然后根据A右侧的符号信息求出A的FOLLOW集。
例:
E→TE’,
E’→+TE’,
E’→ε,
T→FT’,
T’→*FT’,
T’→ε,
F→(E)|i
FOLLOW(E)= {),#},//E为开始符号,加入#,E的后面有终结符)
FOLLOW(E’)= FOLLOW(E)={ ) ,# } //第一个产生式中E’是最后一个符号,所以FOLLOW(E’)中加入FOLLOW(E)。
FOLLOW(T)={FIRST(E’)-{e}}∪FOLLOW(E)∪FOLLOW(E’) = { + , ) , # } //第一个产生是中T后面有非终结符E’,所以在FOLLOW(T)中加入{FIRST(E’)-{e}},而E’→ε,所以T有可能是最后一个符号,所以把FOLLOW(E)加入FOLLOW(T);同理第二个产生式中,要把FOLLOW(E’)加入FOLLOW(T)。
FOLLOW(T’)= FOLLOW(T)= { + , ) , # }
FOLLOW(F)={FIRST(T’)-{e}})∪FOLLOW(T)∪FOLLOW(T’) = {+,*,) ,# }
first集合follow集的求法的更多相关文章
- 编译原理 First集和Follow集的求法
转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...
- 编译原理中Follow集的求法
经过前阵子的各种百度以及对课本的反复研究,终于弄明白了follow集的求法,下面记录一下! 首先引用龙书里面的一段较为公式化的follow集求法的话: 计算所有非终结符号A的follow(A)集合时, ...
- 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...
- FIRST 集与 FOLLOW 集
文法: S→ABc A→a|ε B→b|ε First 集合求法: 能 由非终结符号推出的所有的开头符号或可能的ε,但要求这个开头符号是终结符号.如此题 A 可以推导出 a 和ε,所以 FIRST(A ...
- 编译原理-First集和Follow集
刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法: ...
- 简单的FOLLOW集演示程序
/* * 该程序用于计算某个非终结符的 FOLLOW 集合 * RexfieldVon * 2013年6月30日16:02:47 */ #include <stdio.h> #includ ...
- FIRST集和FOLLOW集
省略号代表其他相关产生式得出的终结符号,一开始的时候,省略号里面是没有的 求FIRST集 情况壹 如果A只在→的右边出现,那么FIRST(A)={A},例子M→α,FIRST(α)={α} 情况 ...
- 求FIRST集和FOLLOW集
花了点时间弄了个大概,希望对和我一样的人有所帮助. 文法如下: E -> TE'E' -> +TE'|εT -> FT'T' -> *FT'|εF -> (E)|id ...
- C#集合之集(set)
包含不重复元素的集合称为“集(set)”..NET Framework包含两个集HashSet<T>和SortedSet<T>,它们都实现ISet<T>接口.Has ...
随机推荐
- iptables 表和链的对应关系
filter表 主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP.ACCEPT.REJECT.LOG).filter 表对应的内核模块为iptable_filter,包含三个规 ...
- go 优秀文档
go语言资料汇总 : https://blog.zhnytech.com/articles/2016/07/15/Golang%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99% ...
- Notepad++ 【自动完成】与【输入时提示函数参数】互相冲突,无奈
Notepad++ 既然可以在输入时提示函数参数,可是当提示函数参数的时候,输入具体参数时[自动完成]失效了. 一位用户遇到和我一样的问题:https://community.notepad-plus ...
- 如何快速将磁盘的MBR分区方式改成GPT分区方式
注:修改分区格式时此硬盘不能是在使用状态(简单说就是不能出现在盘符中),如果在使用中先在计算机的磁盘管理中删除卷. 由于MBR分区表模式的硬盘最大只支持2T的硬盘空间,而现在我们的硬盘越来越大,有时候 ...
- 快速排序详解(C语言/python)
快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...
- python 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
在导入csv文件中,出现如上所示的错误,经过查阅资料,解决方法如下: 方法一: pd.read_csv(file_path, encoding='unicode_escape') 方法二: pd.re ...
- 洛谷P5017:摆渡车——题解
https://www.luogu.org/problem/P5017 参考:https://www.luogu.org/blog/ztyluogucpp/solution-p5017 我想我大概是废 ...
- NodeJS安装及部署(Linux系统)
环境说明:Linux环境,CentOS 7版本. 第一步:下载node地址:https://nodejs.org/en/download/ 下载后,是一个[node-v10.16.0-linux-x6 ...
- Grafana邮件报警
一.概述 报警是Grafana的一项革命性功能,它让Grafana从一个数据可视化工具变成一个真正的任务监控工具.报警规则可以使用现有的图表控制面板设置,阈值可以通过拖拉右边的线控制,非常简单.Gra ...
- SecureCRT上传本地文件到linux
1.使用crt登录到需要操作的linux系统 2.按Alt+P打开sftp传输界面 3.输入pur指令加文件路径,例如:put E://srs-3.0.zip按enter就可以 4.再返回crt界面, ...