FIRST集和 FOLLOW集的计算
文章目录
- 计算文法符号X的FIRST(X)
- 计算非终结符A的FOLLOW(A)
- 表达式文法各产生式的SELECT集
- 预测分析表
- LL(1)文法的分析方法
- ==预测分析法实现步骤==
参考哈工大课件
计算文法符号X的FIRST(X)
FIRST ( X ):可以从X推导出的所有串首终结符构成的集合
如果 X =>* ε,那么 ε∈FIRST ( X )
- 如果X是一个终结符或者 X→ε∈P,那么FIRST ( X ) = { X }或者将ε加入到FIRST( X )中
- 如果X是一个非终结符,且 X→Y1…Yk∈P (k≥1),那么如果对于某个i,a在FIRST (Yi ) 中且ε 在所有的FIRST(Y1) , … , FIRST(Yi-1)中(即Y1…Yi-1 =>* ε ),就把a加入到FIRST( X )中。如果对于所有的 j =1,2, . . . , k,ε在FIRST(Yj)中,那么将ε加入到FIRST( X )
计算非终结符A的FOLLOW(A)
FOLLOW(A):可能在某个句型中紧跟在A后边的终结符a的集合
FOLLOW(A)={a| S =>* αAaβ, a∈VT,α,β∈(VT∪VN)*}
如果A是某个句型的的最右符号,则将结束符“#”添加到FOLLOW(A)中
First | Follow | ||
---|---|---|---|
① E → TE’ | E | { ( id } | { # )} |
② E’ → +TE’ or ε | E’ | { + ε } | { # )} |
③ T → FT’ | T | { ( id } | { + # )} |
④ T’ → *FT’ or ε | T’ | { * ε } | { + # )} |
⑤ F → (E) or id | F | { ( id } | { * + # )} |
首先,E是句型的开始符号,也是某个句型的最右符号,所以将“#”加入follow集中。然后开始逐个分析每一条产生式。
根据①,E’的first集的所有终结符可以跟在T的后面,所以将firstE中所有终结符+,加入到E的follow集中。由于E’的first集中包含空串,因此所有能够跟在E后面的符号都能跟在T后面。所以将followE中的符号#加到followT中。E’是产生式①的最后一个符号,也就是说能够跟在E后的终结符也能跟在E’后。所以将followE中的符号#加到followE’中。
根据②,firstE’中+加入followT,因为E’可以为空串,因而followE’需要加入followT,因为E’是最后一个符号,又是句型的开头符号所以不变。由于产生式右边有空串,所以要将#加入followE’。
根据③,firstT’中*加入followF,因为firstT’含有空串,所以followT也要加入followF中,因为T’是右部的最后一个符号,所以能跟在T后面的符号也能跟在T’中,将followT加入followT’。
根据⑤,(E),将)加入followE。
不断应用规则,直到没有新的终结符可以被加入到任何FOLLOW集合中为止。
表达式文法各产生式的SELECT集
X | FIRST( X ) | FOLLOW( X ) |
---|---|---|
E | ( id | # ) |
E ’ | + ε | # ) |
T | ( id | + ) # |
T ’ | * ε | + ) # |
F | ( id | * + ) # |
(1) E → T E ’ SELECT (1)= { ( id } 产生式右部第一个非终结符T的first集中的终结符
(2) E '→ + T E ’ SELECT (2)= { + } 产生式右部是以非终结符开头的,所以只有这个非终结符
(3) E '→ε SELECT (3)= { # ) } 空产生式,取E’follow集合中间的元素
(4) T → F T ’ SELECT (4)= { ( id } 同1,右部第一个非终结符F的first集合的终结符
(5) T ’ → * F T ’ SELECT (5)= { * } 同2
(6) T ’ →ε SELECT (6)= { + ) # } 同3
(7) F → ( E ) SELECT (7)= { ( } 同3
(8) F → id SELECT (8)= { id } 同3
由于2、3&5、6&7、8 产生式具有相同左部,其select集互不相交,所以这个文法是LL1文法。
预测分析表
根据上述分析构造预测分析表
select集中有( id + # ) *这几个符号,由此构造分析表:
第一个产生式的select集有 ( 和 id,也就是说当E遇到( 和 id 时,可以选用第一个产生式。
E’有两个产生式,分别对应+和 # ),分别填入表中
LL(1)文法的分析方法
递归的预测分析法
递归的预测分析法是指:在递归下降分析中,根据预测分析表进行产生式的选择
非递归的预测分析法
非递归的预测分析不需要为每个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机,也叫表驱动的预测分析
表驱动的预测分析法
输入:一个串w和文法G的分析表M
输出:如果w在L(G )中,输出w的最左推导;否则给出错误指示
方法:最初,语法分析器的格局如下:输入缓冲区中是w#,G的开始符号位于栈顶,其下面是#。下面的程序使用预测分析表M生成了处理这个输入的预测分析过程
设置ip使它指向w的第一个符号,其中ip 是输入指针;
令X=栈顶符号;
while ( X ≠#){ /* 栈非空 */ if ( X 等于ip所指向的符号a) 执行栈的弹出操作,将ip向前移动一个位置;else if ( M是一个终结符号) error ( ) ;else if ( M[X,a]是一个报错条目) error ( ) ; else if ( M[X,a] = X → Y1Y2 … Yk){输出产生式 X → Y1Y2 … Yk ;弹出栈顶符号;将 Yk,Yk-1…,Yi 压入栈中,其中Y1位于栈顶。 }令X=栈顶符号
}
递归的预测分析法vs.非递归的预测分析法
递归的预测分析法 | 非递归的预测分析法 |
---|---|
程序规模 | 程序规模较大, 不需载入分析表 |
直观性 | 较好 |
效率 | 较低 |
自动生成 | 较难 |
预测分析法实现步骤
1)构造文法
2)改造文法:消除二义性、消除左递归、消除回溯
3)求每个变量的FIRST集和FOLLOW集,从而求得每个候选式的SELECT集
4)检查是不是 LL(1) 文法。若是,构造预测分析表
5)对于递归的预测分析,根据预测分析表为每一个非终结符编写一个过程;对于非递归的预测分析,实现表驱动的预测分析算法
预测分析中的错误检测
两种情况下可以检测到错误:
- 栈顶的终结符和当前输入符号不匹配
- 栈顶非终结符与当前输入符号在预测分析表对应项中的信息为空
预测分析中的错误恢复
恐慌模式
- 忽略输入中的一些符号,直到输入中出现由设计者选定的同步词法单元(synchronizing token)集合中的某个词法单元
其效果依赖于同步集合的选取。集合的选取应该使得语法分析器能从实际遇到的错误中快速恢复
例如可以把FOLLOW(A)中的所有终结符放入非终结符A的同步记号集合
- 如果终结符在栈顶而不能匹配,一个简单的办法就是弹出此终结符
分析表的使用方法
- 如果M[A,a]是空,表示检测到错误,根据恐慌模式,忽略输入符号a
- 如果M[A,a]是synch,则弹出栈顶的非终结符A,试图继续分析后面的语法成分
- 如果栈顶的终结符和输入符号不匹配,则弹出栈顶的终结符
FIRST集和 FOLLOW集的计算相关推荐
- 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理
本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...
- FIRST集和FOLLOW集的计算
文章目录 `FIRST`集的计算 计算`FIRST(x)` 具体算法 计算`$X_21,X_2,X_3,...,X_n$`的`FIRST`集 FOLLOW集的计算 算法 FIRST集的计算 计算FIR ...
- FIRST集和FOLLOW集的构造
FIRST集和FOLLOW集的定义 注意:1:FIRST集的定义中\(\alpha和\beta\)可以是终结符也可以是非终结符.2:FOLLOW集的定义中\(\mu和\beta\)可以是终结符也可以是 ...
- 编译原理-First集和Follow集
刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法: ...
- 【编译原理】FIRST集和FOLLOW集构造法速学
编译原理速成大法 FIRST集和FOLLOW集构造法速成 FIRST FOLLOW FIRST集和FOLLOW集构造法速成 例:对于文法G(E) 首先像E,T,E',F这样的就是非终结符 +,*, ε ...
- 【编译原理】First集和Follow集简易解释(偏人话)
\ε:非ε元素 First集和Follow集是集合 First集规则(相应字母在->左边,查找->右边第一个东西) ①A->aB,a加进First(A): (->右边第一个是终 ...
- LL(1)文法中FIRST集和FOLLOW集的计算方法
文章目录 深入理解 FIRST集的定义 FIRST集的实际意义 FIRST集的计算方法 FOLLOW集的定义 FOLLOW集的实际意义 FOLLOW集的计算方法 预测分析表的实质 LL(1)文法的判断 ...
- 编译原理中LL(1)文法求FIRST集和FOLLOW集的方法
一.求FIRST集 1.右部首个字符是终结符则加入左部字符的FIRST集中,比如对形如U->a-的产生式(其中a是终结符),把a收入到FIRST(U)中. 2.右部首个字符是非终结符, 若此非终 ...
- 编译原理 First集和Follow集的求法
转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...
- FIRST和FOLLOW集的计算
最近马上要步入考试周了,编译原理的这个Follow集一直令我头大啊,今天百度了下下,找到一篇文章,看了以后我瞬间就明白了如何求解Follow集~~哈哈,如果你也不知道如何求解Follow集,请看看下面 ...
最新文章
- 谷歌 Fuchsia 上手体验,将取代Android/win10
- 实用的bit 位操作
- SessionID 的本质
- android跳转到打电话,Android 应用跳转到拨打电话界面或qq进行聊天(qq咨询)
- 备战实习求职的一些感想(已拿阿里offer)
- HDU 4893 线段树
- Live Migrate 操作 - 每天5分钟玩转 OpenStack(42)
- [JavaWeb-Servlet]Servlet的体系结构
- 《南方都市报》:中国互联网“公共性”正在变形或流失
- 【来自项目的技术点】— 聊聊键盘长按的时候解决卡顿方案
- 学计算机专业的需要买电脑吗,高三党升级“准大一生”,有必要买电脑吗?学长的回答可以参考...
- SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!
- 在linux系统下挂接(mount)光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX...
- Excel中 对「对话气泡(吹き出し)」中的文字添加删除线 等操作
- sql 获取当前之后某天的日期
- 二分法求函数零点:(递归方法和非递归方法)
- word怎么竖向选中,word怎么文字竖排的两种方法
- eth入门之web2 与 web3 的对比
- 网络安全之KALI使用
- redis-使用Java代码操作
热门文章
- 【bug】修复YYC松鼠短视频系统V2.7版本bug 注册输入验证码提示邀请码,输入邀请码提示错误
- IAT HOOK、EAT HOOK和Inline Hook
- Homekit智能开关/定时控制
- SuperSU下载 | SuperSU Download
- MySQL安装教程 + 安装包
- fastlane二开java_从入门开始使用Fastlane
- spring boot中使用websocket实现点对点通信与服务器推送
- debian 修改桌面背景
- 西湖论剑2021 MISC部分(LSB,取证)
- esxi虚拟化是基于linux吗,虚拟化 – 如何在虚拟机中运行VMWare ESX或ESXi?