已知文法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. 一招解决下载或下拉GitHub项目速度太慢的问题

    相信很多朋友都有过这样的体验,就是从Github上下载或clone别人的项目时特别慢,甚至还会出现链接意外终止的情况,那么今天就来给大家分享一个提速的方法,步骤也非常简单,亲测有效! 首先进入你的目标 ...

  2. ElasticSearch之配置文件详解

    ################################### Cluster ################################### #定义集群名称,默认是elasticse ...

  3. 备忘录——C#获取微信小程序的云数据库中数据

    目录 0. 背景说明 0.2 获取AccessToken 0.3 数据库查询 0.4 文件下载 2. 简单的封装 3. 简单测试 4. 参考文档 shanzm-2021年8月17日 17:14:24 ...

  4. webpack4 插件ProvidePlugin使用遇到的问题

    根据博客https://www.cnblogs.com/geyouneihan/p/9769808.html学习webpack4中使用ProvidePlugin遇到了自定义js无法使用的问题,解决之后 ...

  5. rabbitMq镜像集群

    rabbitMq延迟投递的方案 1 把消息记录到数据路,通过定时器进行刷新 2 TTL 加上死信队列 :通过路由把过期的消息同步到死信队列,通过死信队列的消费者进行消费 3

  6. 图解最长回文子串「Manacher 算法」,基础思路感性上的解析

    问题描述: 给你一个字符串 s,找到 s 中最长的回文子串. 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 「Ma ...

  7. java IO操作,看完你应该就清晰了。

    前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...

  8. (九)羽夏看C语言——C++番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  9. Python - 面向对象编程 - 实战(4)

    需求:士兵突进 士兵许三多有一把 AK47 士兵可以开火 枪能够发射子弹 枪装填子弹,可以增加子弹数量 需求分析 很明显有两个类:士兵类,枪类 AK47 是枪名,是枪类的属性,每把枪都有子弹数,所以子 ...

  10. Golang入门学习(二):控制分支

    文章目录 @[TOC] 1. 控制分支 1.1 if-else分支 1.2 switch分支 1.4 while 和do...while循环结构 1.5 多种循环结构 1.6 break 1.7 co ...