编译原理: 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 ...
随机推荐
- Maven解决依赖冲突
依赖冲突 若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的. 短路优先 本项目-->A.jar-->B ...
- jQuery中的表单对象属性过滤选择器(四、八)::enabled、:disabled、:checked、:selected
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- Servlet的特点及运行过程
- 一. Go微服务--隔离设计
1. 前言 隔离设计源于船舶行业,一般而言无论大船还是小船,都会有一些隔板,将船分为不同的空间,这样如果有船舱漏水一般只会影响这一小块空间,不至于把整个船都给搞沉了. 同样我们的软件服务也是一个道理, ...
- Redis(三):新数据类型
配置文件redis.conf详解 bind=127.0.0.1 # 表示只能在本机中访问redis,将该行注释掉,即可接收任何IP地址的访问 protected-mode # 设置为no,表示关闭保护 ...
- 有关Java动态数组的一个小问题
前言 问题描述 今天遇到一个关于集合的问题,觉得比较有趣,记录一下,这个问题是:定义一个用户类,至少包含姓名,年龄,生日,qq邮箱,初始化10个用户,利用String操作,提取qq到List集合中,姓 ...
- ES6 class——name属性与new.target属性
name属性与new.target属性 name属性: 1.类.name,输出的是类的名字. 2.如果是在类表达式中,类有名字,那么输出结果是类的名字:类没有名字的话,那么输出结果会是表达式中变量或者 ...
- Ubuntu下 QT中配置ROS-Kinetic
打开qtcreater自动加载ros环境,通过修改*.desktop文件 gedit ~/.local/share/applications/qtcreator.desktop 将其中Exec=XXX ...
- python库--tensorflow
方法 返回值类型 参数 说明 张量 .constant() Tensort 张量 实例t value 创建一个常量tensor dtype=None 输出类型 shape=None 返回tens ...
- python模块--calendar
方法 返回值类型 说明 .calendar(theyear, w=2, l=1, c=6, m=3) str 返回指定年份的年历, w: 每个日期的宽度, l: 每一行的纵向宽度, c: 月与月之间的 ...