已知文法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)的计算的更多相关文章

  1. 编译原理 First,Follow,select集求法

    参考:https://blog.csdn.net/CooperNiu/article/details/78524688

  2. 编译原理LL1文法Follow集算法实现

    import hjzgg.first.First; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set ...

  3. 编译原理-First集和Follow集

    刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法:   ...

  4. 编译原理 First集和Follow集的求法

    转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...

  5. 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法

    <编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...

  6. 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集

    近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...

  7. 编译原理——求解First,Follow,Firstvt和Lastvt集合

    转载地址 http://dongtq2010.blog.163.com/blog/static/1750224812011520113332714/ 学编译原理的时候,印象最深的莫过于这四个集合了,而 ...

  8. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  9. 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析

    <编译原理>构造 LL(1) 分析表的步骤 - 例题解析 易错点及扩展: 1.求每个产生式的 SELECT 集 2.注意区分是对谁 FIRST 集 FOLLOW 集 3.开始符号的 FOL ...

随机推荐

  1. protected访问权限

    Java中protected方法访问权限的问题 protected 修饰的成员变量或方法,只能在同包或子类可访问; package 1 public class TestPackage { prote ...

  2. Go: LeetCode简单题,简单做(sort.Search)

    前言 正值端午佳节,LeetCode也很懂.这两天都是简单题,早点做完去包粽子. 故事从一道简单题说起 第一个错误的版本 简单题 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最 ...

  3. 原生 JS 与 jQuery 中的 AJAX

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更 ...

  4. ELK数据迁移,ES快照备份迁移

    通过curl命令或者kibana快照备份,恢复的方式进行数据迁移 环境介绍 之前创建的ELK 因为VPC环境的问题,需要对ELK从新部署,但是还需要保留现有的数据,于是便有了这篇文档. 10.0.20 ...

  5. Linux内核编译配置脚本

    环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...

  6. AOP联盟通知类型和Spring编写代理半自动

    一.cglib功能更强大 二.Spring核心jar包 三.AOP联盟通知 三.代码实现Spring半自动代理 1.环绕通知的切面 2.bean.xml配置 3.创建bean容器,获取bean,即已经 ...

  7. go 1.14上怎么下载第三方包

    终端 go env -w GO111MODULE=on GOPATH-->src/pkg/bin in src源码包中 某个包中 go mod init   XXX(表示当前报的第三方依赖) 然 ...

  8. Docker安装Nginx(含:Windows启动、重启、停止)

    Docker安装Nginx #docker pull nginx:latest (第一次启动Docker-Nginx) #docker run --detach \ --publish 80:80 \ ...

  9. Selenium系列5-XPath路径表达式

    Xpath介绍 XPath 使用路径表达式在 XML 文档中进行导航 XPath 使用路径表达式来选取 XML 文档中的节点或者节点集.这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似. ...

  10. HDU1213How Many Tables(基础并查集)

    HDU1213How Many Tables Problem Description Today is Ignatius' birthday. He invites a lot of friends. ...