编译原理: FIRST(x) FOLLOW(x) SELECT(x)的计算
已知文法G[S]:
S→MH|a
H→LSo|ε
K→dML|ε
L→eHf
M→K|bLM
判断G是否是LL(1)文法。
First计算
First集合的定义就是某个非终结符表达式可以推导出来的第一个字符可以是什么
比如表达式S --> abb,它的First(S)={a}
First(S)={a}+First(M)+First(H)+{ε}={a,b,d,e,ε}
# S表达式存在单个的终结符a,添加{a}
# S表达式以M开头,添加First(M)
# 根据后面的表达式判断,M可以推出K,K可以推出空,所以M可以为空,此时S以H开头,添加First(H)
# 由于H也可以推出空,所以S最终也会指向空,添加 空集
First(M)={b}+First(K)+{ε}={b,d,ε}
# M表达式以终结符b开头,添加{b}
# M表达式可以推导出单个的K表达式,所以添加First(K)
# K有可能推导出空集,即M可以推导出空,所以添加 空集
First(K)={d}+{ε}={d,ε}
# K可以以终结符d开头,添加{d}
# K可以推导出空,添加空集
First(H)=First(L)+{ε}={e,ε}
# H可以推导出以L开头的表达式,所以添加First(L)
# H可以推导出空,所以添加空集
First(L)={e}
# L只能推导出一个表达式,并且开头是终结符,所以添加{e}
## 最后将已知的表达式代入到未知的表达式当中去,即可求出全部First集合
Follow计算
Follow表示某个非终结符后面可以跟着什么样的字符
Follow集不存在空集
为表达式编号
1: S→MH|a
2: H→LSo|ε
3: K→dML|ε
4: L→eHf
5: M→K|bLM
Follow(S)={$}+{o}={o,$}
# 在表达式1中,S是一个非终结符,S是孤立的一个表达式,其Follow可以添加$,即添加{$}
# 在表达式2中,S后面跟上了o,所以添加{o}
Follow(H)=Follow(S)+{f}={f,o,$}
# 在表达式1中,S后面跟了什么,MH后面就跟了什么,所以添加Follow(S)
# 在表达式4中,H后面跟了f,所以添加{f}
Follow(M)=First(H)+Follow(S)+First(L)={e,o,$}
# 在表达式1中,M后面跟了H,所以添加First(H)
# 在表达式2中可知,H可以推导出空,所以回到表达式1,S后面跟了什么,M后面就跟了什么,所以添加Follow(S)
# 在表达式3中,M后面跟了非终结符L,所以添加First(L)
# 在表达式5中,M后面跟了什么,bLM后面就跟什么,都是Follow(M),表达式不变
Follow(L)=First(S)+Follow(K)+{o}+{$}+First(M)+Follow(M)={a,b,d,e,o,$}
# 在表达式2中,L后面跟了非终结符S,所以添加First(S)
# 在表达式2中,First(S)可以推出空,所以此时L后面跟着o,添加{o}
# 在表达式3中,K后面跟了什么,dML后面就跟了什么,所以添加Follow(K)
# 在表达式4中,L属于单一元素,所以添加$
# 在表达式5中,L后面跟上了非终结符M,所以添加First(M)
# 在表达式5中,从上得知,First(M)可以推导出空,所以此时M后面跟着什么,L后面就要跟着什么,所以添加Follow(M)
Follow(K)={$}+Follow(M)={e,o,$}
# 在表达式3中,K是单一字符,添加{$}
# 在表达式5中,M后面跟着什么,K后面就跟着什么,所以添加Follow(M)
注意:在书写Follow集中要时刻检查First集是否可以为空.
Select计算
分割表达式,如果非空则是First集,是空则为Follow集
Select(S→MH)=First(M)+First(H)+Follow(S)={b,d,e,o,$}
# S以M开头,加入First(M)
# First(M)可以为空,加入First(H)
# M和H都可以为空,加入Follow(S)
Select(S→a)={a}
# S只能推导出a,加入{a}
Select(H→LSo)=First(L)={e}
# H以L开头,并且First(L)不可以为空,即加入First(L)
Select(H→ε)=Follow(H)={f,o,$}
# H推导出空,加入Follow(H)
Select(K→dML)={d}
# K以终结符d开头,加入{d}
Select(K→ε)=Follow(K)={e,o,$}
# K可以为空,加入Follow(K)
Select(L→eHf)={e}
# L以终结符e开头,加入{e}
Select(M→K)=First(K)+Follow(M)={d,e,o,$}
# M可以推出K,加入First(K)
# First(K)可以为空,即M可以加入Follow(M)
Select(M→bLM)={b}
# M可以推出以终结符b开头,加入{b}
编译原理: FIRST(x) FOLLOW(x) SELECT(x)的计算的更多相关文章
- 编译原理 First,Follow,select集求法
参考:https://blog.csdn.net/CooperNiu/article/details/78524688
- 编译原理LL1文法Follow集算法实现
import hjzgg.first.First; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set ...
- 编译原理-First集和Follow集
刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法: ...
- 编译原理 First集和Follow集的求法
转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...
- 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法
<编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...
- 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...
- 编译原理——求解First,Follow,Firstvt和Lastvt集合
转载地址 http://dongtq2010.blog.163.com/blog/static/1750224812011520113332714/ 学编译原理的时候,印象最深的莫过于这四个集合了,而 ...
- 编译原理简单语法分析器(first,follow,分析表)源码下载
编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...
- 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析
<编译原理>构造 LL(1) 分析表的步骤 - 例题解析 易错点及扩展: 1.求每个产生式的 SELECT 集 2.注意区分是对谁 FIRST 集 FOLLOW 集 3.开始符号的 FOL ...
随机推荐
- 使用dom4j工具:获取xml中的标签属性(三)
package dom4j_read; import java.io.File; import java.util.List; import org.dom4j.Attribute; import o ...
- Spring Boot +Vue 项目实战笔记(二):前后端结合测试(登录页面开发)
前言:关于开发环境 每位 Coder 都有自己偏好的开发工具,从大的方面划分主要有文本编辑器流和 IDE 流两种,我有一段时间也喜欢用编辑器(Sublime Text.Vim),但对我来说开发效率确实 ...
- MySQL-存储引擎-1
一.MySQL存储引擎 mysql> create table country( -> country_id smallint unsigned not null auto_increme ...
- Centos7.4 安装MySQL 5.7.21 (通用二进制包)
1.下载安装包 MySQL 官方下载地址:https://dev.mysql.com/downloads/mysql/ MySQL 5.7官方安装文档:https://dev.mysql.com/do ...
- linux多次登录失败锁定账户
2021-07-22 1.配置对系统进行失败的ssh登录尝试后锁定用户帐户 # 配置登录访问的限制 vi /etc/pam.d/system-auth 或者 vi etc/pam.d/password ...
- Qt 自定义事件
Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...
- golang channel原理
channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...
- 移动端ios上下滑动翻页事件失效
移动端开发过程中,在添加上下滑动事件时候,引入了最常用的移动端库zepto.js及其touch模块,有一种现象,安卓的手机没有问题,上下滑动翻页很正常 :但是到了ios上面,好啊,上下滑动会出现弹性滚 ...
- LeetCode刷题模板(1):《我要打10个》之二分法
Author : 叨陪鲤 Email : vip_13031075266@163.com Date : 2021.01.23 Copyright : 未 ...
- 多Host情况下IDEA无法启动Tomcat的问题
学习Java Web,学到将WAR包部署到Tomcat中时,遇到一个问题. 部署WAR包的过程本身没什么问题,把.war文件放在<Tomcat安装目录>/webapps/中,然后修改< ...