FIRST集与FOLLOW集构造步骤
首先,这两个集主语是候选式,是V*中的一个终结符/非终结符。
由于FOLLOW集的定义和构造步骤里面都涉及FIRST集,故先介绍FIRST集。
一.FIRST集的定义如下:
FIRST(α)={a|α=>aβ, a∈Vt, α, β∈V*},若α=>(*)ε则规定ε∈FRIST(α)。
先看这个定义的主干部分,首符集里面的组成元素都是终结符,什么样的终结符?产生式右边第一个位置上的终结符,它会被纳入产生式左边的非终结符的首符集。
这个定义的补充部分意思是,如果非终结符可经多步推到得到ε,那么ε也纳入它的首符集。
二. FIRST集的构造步骤如下:
1.若X ∈Vt,则FIRST(X)={X}
2.若X∈Vn,且有产生式X→a…,则把a加入到FIRST(X)中;
若X→ɛ也是一个产生式,则把ɛ也加到FIRST(X)中。
3.若X→Y…是一个产生式且Y∈Vn,则把FIRST(Y)中的所有非ɛ元素都加到FIRST(X)中;若X → Y1Y2…YK 是一个产生式,Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j ≤i-1, FIRST(Yj)都含有ɛ (即Y1…Y(i-1) =>(*)ɛ),则把 FIRST(Yj)中的所有非ɛ元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj , j=1,2,…,K)均含有ɛ,则把 ɛ 加到FRIST(X)中。
三. FOLLOW集的定义如下:
FOLLOW(A)={a | S=>()μ A β且a ∈ FRIST(β),μ ∈V,β∈V+ }
若S=>()u A β ,且β=>()ε,则#∈FOLLOW(A)
同样,我们先看这个定义的主干部分,FOLLOW集里面的元素都来自首符集,说明也都是非终结符,与首符集不同的是,A的FOLLOW集,A出现在产生式的右侧,而不是左侧。
这个定义的补充部分意思是,如果一个产生式经过多部推导后得到u A β,而跟在A后面的β又能够经过多步推导得到ε,则把#加到FOLLOW(A)。
四.FOLLOW集的构造步骤如下:
1 对于文法的开始符号S,置#于FOLLOW(S) 中。
2 若A→α B β是一个产生式,则把FIRST(β)中的所有非ɛ元素加至FOLLOW(B)中,把FIRST(β)中的ε换成#加至FOLLOW(B)。
3 若A→α B是一个产生式,或A→ αBβ是 一个产生式而β=>(*)ɛ (即 ɛ∈FIRST(β)), 则把FOLLOW(A)加至FOLLOW(B)中。
五.举个例子
G[ E]:
(1) E → TE’
(2) E’ → +TE’
(3) E’→ ɛ
(4) T → FT’
(5) T’→ *FT’
(6) T’ → ɛ
(7) F → (E)
(8) F → i
试找出文法G的FIRST集and FOLLOW集
(请拿出纸笔按照上面的步骤走一遍哦~)
一起看一下答案吧~
各非终结符的FIRST集合如下:
FIRST(E)={(,i}
FIRST(E’)={+,ε}
FIRST(T)={(,i}
FIRST(T’)={*,ε}
FIRST(F)={(,i}
各非终结符的FOLLOW集合为:
FOLLOW(E)={),#}
FOLLOW(E’)={) ,#}
FOLLOW(T)={+,) ,#}
FOLLOW(T’)={+,) ,#}
FOLLOW(F)={*,+,),#}
提示:注意那些会推导出ε的候选式引发的连锁效应。
相关文章:

Bossie Awards 2013:最佳开源数据中心和云软件
当Facebook 的开源计算项目(OCP)酝酿着设计更好的服务器和网络时,其他开源项目也纷纷重塑数据库,应用平台以及下一代应用程序的虚拟化层。你还不知道吧,下一代的“云”基础设施管理工具终将来自开源产品。 近日&#x…

Laravel开启跨域的方法
1、建立中间件Cors.php 命令:php artisan make:middleware Cors 在/app/Http/Middleware/ 目录下会出现一个Cors.php 文件。 内容如下: <?phpnamespace App\Http\Middleware;use Closure;class Cors {/*** Handle an incoming request.** param \Il…

【组队学习】【33期】动手学数据分析
动手学数据分析 航路开辟者:陈安东、金娟娟、杨佳达、老表、李玲、张文涛、高立业领航员:张文恺航海士:武帅、戴治旭、初晓宇 基本信息 内容属性:精品入门课系列开源内容:https://github.com/datawhalechina/hands-…

LL(1)预测分析表的构造
LL(1)分析法(即预测分析法)是自上而下文法中的一种,使用这种方法需要用到LL(1)预测分析表。 前提:掌握了FIRST集和FOLLOW集的构造。 步骤:对于每一个产生式A→α (1) 对每个终结符a∈FIRST(α)…

新的sublime text已经上传网盘,地址写在下面
注:新网盘地址,之前的关于sublime text的网盘地址已效 网盘地址:http://pan.baidu.com/s/1oVHAm 压缩文件结构 从上到下依次是: 1.sublime text3 32bit便携版本的压缩包,解压可用. 64bit的用户可以将:http:…

WebAssembly Studio:Mozilla提供的WASM工具
\看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!\\\WebAssembly Studio是Mozilla开发的一款在线工具,用于将C/C和Rust代码编译为WASM格式。\\WebAssembly Studio是M…

【组队学习】【33期】3. 李宏毅机器学习(含深度学习)
李宏毅机器学习(含深度学习) 航路开辟者:王茂霖、陈安东,刘峥嵘,李玲领航员:宋泽山航海士:汪健麟、叶梁 基本信息 开源内容:https://github.com/datawhalechina/leeml-notes开源内…

Linux 引导和系统启动
bootstrap 引导程序;鞋带 -> 简称 boot 启动 pull oneself up by one’s bootstraps.(体现计算机系统启动的难处) Linux系统启动分为两大部分: 一. 第一部分:机器启动(BIOS到 加载内核 ,…
【数据结构】支持四则混合运算的计算器(转)
1.给出两个数,用户再指定操作符,要求计算结果,这实现起来很容易; 2.多个数,但只涉及同一优先级的操作符,做起来也很容易; 3.多个数,不同优先级的操作符,怎么办呢…

TypeScript学习笔记之 接口(Interface)
在java中,接口是用来定义一些规范,使用这些接口,就必须实现接口中的方法,而且接口中的属性必须是常量。javascript中是没有接口的概念的。所以TypeScript在编译成 JavaScript 的时候,所有的接口都会被擦除掉。 而TypeS…

【组队学习】【33期】数据可视化(Matplotlib)
数据可视化(Matplotlib) 航路开辟者:杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员:王森航海士:肖明远、郭棉昇 基本信息 开源内容:https://github.com/datawhalechina/fantastic-matplotlib开源内容&…

布尔定理及证明(完整版)
这篇文章的目的是以布尔代数公理证明定理。 对偶原理:0with1, with 互换以后,公理(定理)任然成立。 布尔代数的公理如下 单变量的布尔代数定理如下 单变量的布尔代数定理很容易用真值表证明。 多变量的布尔定理如下 交换律&…

创建DLL动态链接库——声明导出法
DLL声明导出法:是通过使用__declspec(dllexport),添加到需要导出的函数前,进行声明。 头文件定义如下(OPdll.h): 源文件定义如下(OPdll.cpp): 通过以上两个文件,编译过后即可生成OPdll.lib和OPdll.dll两个库…

【组队学习】【33期】Scratch(一级)
Scratch一级 航路开辟者:王思齐、马燕鹏领航员:马燕鹏航海士:马燕鹏 基本信息 开源内容:https://github.com/datawhalechina/team-learning-program/tree/master/Scratch内容属性:公测课程内容说明:抽取…

Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护\(parent\)树上启发式合并一下就好了 # include <bits/stdc.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; t…

LR分析法从理解到运用
1、 LR分析器 解释: 分析栈包括符号栈和相应状态栈 分析表包括ACTION表和GOTO表 Ⅰ动作表元素action[Si,aj] 表示当前栈顶状态为S,输入符号为a时所执行的动作。有四种情况:S(移进),r(归约),acc(接受),erro…

Android 判断SD卡是否存在及容量查询
转载:http://blog.csdn.net/xinzheng_wang/article/details/7827775 Android 判断SD卡是否存在及容量查询的简单方法如下:首先要在AndroidManifest.xml中增加SD卡访问权限 [html] view plaincopy <!-- 在SDCard中创建与删除文件权限 --> <uses…
Spring Boot 教程(三): Spring Boot 整合Mybatis
教程简介 本项目内容为Spring Boot教程样例。目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中。如您觉得该项目对您有用,欢迎点击收藏和点赞按钮,给予支持!!教程连载中…

电子学会 软件编程(图形化)一级训练营
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 电子学会 软件编程(图形化)一级训练营 试题来源 青少…

win10 安装 python报错-已安装这个产品的另一版本
尝试清理干净电脑上关于之前安装的Python3,在 输入winR 输入cmd 回车 输入 python 回车 却看到 C:\Users\86136>python ‘python’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 但是再安装,又报出严重错误。 最终解决方案&am…

POJ1276Cash Machine
http://poj.org/problem?id1276 题意 : 给你一个目标钱数,再给你钱币的种数和钱币的面值,让你用这些钱凑出不大于目标钱数的钱然后输出这个最接近且不大于目标钱数的钱。 思路 : 背包问题,还是多重背包,就…

Python中处理时间 —— time模块
time模块 逝去的秒数 逝去的秒数表示从某个时间(Python中是“Thu Jan 1 07:00:00 1970”)开始到现在所经过的秒数。 使用 time.time() 函数可以获得逝去的秒数: >>time.time() 1388330058.8643time.time()返回一个浮点数,可…

学编程必看:逻辑思维测试
2021.09 电子学会图形化一级考试有这样的一个题目: 如下图所示,井深7米,有个蜗牛从井底往上爬,白天爬3米,晚上往下坠2米,问蜗牛几天能从井里爬出来?( ) A. 4B. 5C. 6D. …

explicit specialization of ‘Race‘ after instantiation ,implicit instantiation first required here。
报错1: E:\project\qt\Pokemon3\PokemonServer\pokemon.cpp:470: error: specialization of ‘Race::Race() [with int N 0]’ after instantiation Race<0>::Race() : PokemonBase(ATK) ^ 报错2: explicit specialization of ‘Race’ after ins…

(转载)Linux usbtouchscreen驱动分析
在Linux内核中自带USB触摸屏驱动,以linux-2.6.33.3\drivers\input\touchscreen.c为例,进行解析: 1.驱动加载: static int __init usbtouch_init(void){return usb_register(&usbtouch_driver); //驱动注册} 其中usbtouch_dr…

关于事务隔离级别
2019独角兽企业重金招聘Python工程师标准>>> 第一种 read uncommitted 此状态下脏读,不可重复读,虚读都有可能发生。此状态下两个人同时操作一个数据库表一边开启事务没有提交,另一边也开启事物开始更改数据但是也没有提交&#x…

Datawhale组队学习周报(第047周)
本周报总结了从 2021年01月03日至2022年01月09日,Datawhale组队学习的运行情况,我们一直秉承“与学习者一起成长的理念”,希望这个活动能够让更多的学习者受益。 第 32 期组队学习一共 11 门开源课程,共组建了 11 个学习群&#…

讲座记录:从码农到架构师(精简版)
1.框架学习 不要过于在乎细节 学封装思想 不追新 否则太累 每个框架的设计理念不同 spring 比structs 优秀在哪? 关注增量而非全量 2.如何快速学习一门新技术 “新框架的产生速度远大于个人的学习速度” 先快速学习:了解模板,套路-重复出现的代码 类似做…

Enterprise Library 4 数据访问应用程序块
Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务。应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据、传递数据穿过应用程序层( application layers)、以及将修改的数据提交回数据库系统。应用程序块包含对存储过程和内…
虚拟货币市值回调到4100亿整数关口,EOS逆势站上100关口
虚拟货币虚拟货币市值在过去24小时中,虚拟货币整体回调,市值为4100亿美元。只有EOS逆势上扬,已经站上了100元(17.5美元)上方。虚拟货币市场距离12月份最高点几乎只有一步之遥。EOS走势EOS这种疯狂的势头是很多人预料未…