#First集Follow集通俗易懂的讲解加实例

##First

如A->aB | CD

这里面包含了组成First(A)的两种情况:
以终结符开头,当然要把这个终结符(a)放到A的First里
以非终结符开头,先把C的First放到A的First里

再看如果C的First中有空(∈)的话就把D的First放到A的First里(因为如果C的First为空,那么D的First就有可能紧挨着A,所以就要添进A的Fisrt),如果D也有空的话往后依次类推

小结:
1、对于终结符而言,FIRST集中的元素只有它本身
2、对于非终结符而言,如果开始符是终结符或者空符号串ε,则加入其FIRST集中;若开始符是非终结符,则要加入它的不含ε的FIRST集,并考虑其为ε时的情况。

技巧:First一般从下往上找。
如果要找A的First,我们要找A的定义式,即A在左边的式子,看着他的右边来找。

##Follow

如S->(L) | aL | LC

找Follow的三种情况:
先在候选式(右边)中找到该非终结符,如L(注意例中只有一个定义,但找Follow要看到所有右边出现该非终结符的)

如果L的右边是终结符,    那么这个终结符加入L的Follow如果L的右边是非终结符, 那么把这个非终结符的First除去空加到L的Follow中如果L处在末尾,那么,'->'左边符号的Follow成为L的Follow另外要注意的是:开始符号的Follow中要加上‘#’

小结:
1、FOLLOW集对于非终结符而言,是非终结符的全部后跟符号的集合,如果后跟终结符则加入,如果后跟非终结符,则加入该非终结符的不含空符号串的FIRST集,特别地,文法的识别符的FOLLOW集需要额外的加入‘#’。

技巧:Follow一般从上往下找。
如果要找L的Follow,要从式子的右边找到L,然后来找L的Follow,这与First是不同的。

##举个栗子:

文法:
S→ABc
A→a|ε
B→b|ε

###First集合求法:
能由非终结符号推出的所有的开头符号或可能的ε,但要求这个开头符号是终结符号。

如此题A可以推导出a和ε,所以FIRST(A)={a,ε};同理 FIRST(B)={b,ε};S可以推导出aBc,还可以推导出bc,还可以推导出c,所以FIRST(S)={a,b,c}

###Follow集合的求法:
紧跟随其后面的终结符号或#。但文法的识别符号包含#,在求的时候还要考虑到ε。

具体做法是把所有包含你要求的符号的产生式都找出来,再看哪个有用。 Follow(S)={#}
如求A的Follow集 产生式:S→ABc A→a|ε ,但只有S→ABc 有用。跟随在A后年的终结符号是FIRST(B)={b,ε},当FIRST(B)的元素为ε时,跟随在A后的符号就是c,所以 Follow(A)={b,c} 同理Follow(B)={c}

##SELECT集
###1、定义:
给定上下文无关文法的产生式A→α, A∈VN,α∈V*, 若α不能推导出ε,则SELECT(A→α)=FIRST(α)   
如果α能推导出ε则:SELECT(A→α)=(FIRST(α) –{ε})∪FOLLOW(A)
需要注意的是,SELECT集是针对产生式而言的。

###2、LL(1)文法:
① 一个上下文无关文法是LL(1)文法的充分必要条件是:对每个非终结符A的两个不同产生式,A→α, A→β,满足SELECT(A→α)∩SELECT(A→β)=空集 其中α,β不同时能推导出ε。
② LL(1)文法的含义:
第一个L 从左到右扫描输入串
第二个L 生成的是最左推导
1 向右看一个输入符号便可决定选择哪个产生式。
③LL(1)文法的判别:当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法。因而我们对任给文法需计算FIRST、FOLLOW、SELECT集合,进而判别文法是否为LL(1)文法。

###3.求解示例:
1、文法G [S]为:
  S→AB
  S→bC
  A→ε
  A→b
  B→ε
B→aD
C→AD
C→b
D→aS
D→c
求每个产生式的SELECT集,并判断文法G是否为LL(1)文法?
解:SELECT(S→AB)=(FIRST(AB)-{ε})∪FOLLOW(S)={b,a,#}   
SELECT(S→bC)=FIRST(bC)={b}   
SELECT(A→ε)=(FIRST(ε) -{ε})∪FOLLOW(A)={a,c,#}   
SELECT(A→b)=FIRST(b)={b}   
SELECT(B→ε)=(FIRST(ε) -{ε})∪FOLLOW(B)={#}   
SELECT(B→aD)=FIRST(aD)={a}   
SELECT(C→AD)=FIRST(AD)={a,b,c}   
SELECT(C→b)=FIRST(b)={b}   
SELECT(D→aS)=FIRST(aS)={a}   
SELECT(D→c)=FIRST©={c}

由以上计算结果可得相同左部产生式的SELECT交集为:   

SELECT(S→AB)∩SELECT(S→bC)={b,a,#}∩{b}={b}≠ф   
SELECT(A→ε)∩SELECT(A→b)={a,c,#}∩{b}=ф   
SELECT(B→ε)∩SELECT(B→aD)={#}∩{a}=ф   
SELECT(C→AD)∩SELECT(C→b)={b,a,c}∩{b}={b}≠ф   
SELECT(D→aS)∩SELECT(D→c)={a}∩{c}=ф   
由LL(1)文法定义知该文法不是LL(1)文法,因为具有相同左部其产生式的SELECT集的交集不为空。

小结:
1、Select集的作用是将first集和follow集进行合并,如果两个文法的左端都是A,若他们的select集交集为空,表明他们是两个无关的,不会产生不确定性的文法,反之,则表明文法不是LL(1)文法。

末尾彩蛋

加博主微信,学习更多计算机专业知识,获取程序员保研、考研、就业tips。

打赏也可以


编译原理 First集 Follow集 select集 通俗易懂的讲解 + 实例相关推荐

  1. FIRST集、FOLLOW集和SELECT集

    *一:什么是终结符和非终结符.* 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导. 非终结符:不是终结符的都是非终结符. 如:S-->B,则S是非终结符. (一 ...

  2. 离散数学——FIRST集,FOLLOW集和SELECT集的通俗求法

    离散数学--FIRST集,FOLLOW集和SELECT集的通俗求法 FIRST集合 添加终结符以及空字 若X∈ε,则ε∈FIRST(X) 若X=a-,若a∈VT,则a∈FIRST(X); 添加非终结符 ...

  3. 编译原理求FIRST集、FOLLOW集和SELECT集

    所有大写字母代表非终结符,小写字母代表终结符,省略号代表未知数目(可能为0)的不确定类型的文法符号. First集合: First集合顾名思义就是求一个文法符号串所可能推导出的符号串的第一个终结符的集 ...

  4. 怎样求FIRST集、FOLLOW集和SELECT集

    一.终结符和非终结符 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导. 非终结符:不是终结符的都是非终结符.(非男即女,呵呵) 如:A-->B,则A是非终结符. ...

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

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

  6. [编译原理]FIRST集合FOLLOW集的介绍和求解

    一.定义 1.FIRST集:看产生式左部 FIRST(α) = {a | α ⇒∗\stackrel{*}\Rightarrow⇒∗a···,a∈VTV_{T}VT​} FIRST(α)是α的所有可能 ...

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

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

  8. 最全!最完整的求first集和follow的代码!!!编译原理 FIRST集和FOLLOW集的求法 代码,程序,实验报告

    DEV C++ 项目实现 不会建项目的看这个-->如何创建项目 代码链接:https://pan.baidu.com/s/1VNdrSMXaKu3HI0UQ_TInUQ 提取码:b1qz 使用教 ...

  9. 编译原理-FIRST表-FOLLOW表-LL1表(含python代码)

    问题描述 给出产生式文法,根据文法描述得出其 FIRST 集.FOLLOW 集,若符合 LL(1) 文法,则求出其 LL(1)表格. 算法设计 FIRST 集设计 概念: FIRST 集由终结符和

最新文章

  1. Darwin Streaming Server服务器mp4文件点播返回”415 Unsupported Media Type“错误
  2. python学习路线-Python最佳学习路线
  3. 关于JavaScript语句后面的分号
  4. SAP生产订单预留(上)
  5. android 透明变成白色,android – 状态栏不透明但是白色
  6. jpa 原生sql 查询返回一个实体_JPA查询--使用原生sql 并且把查询结果转为实体对象...
  7. 区块链中的密码学(五)-零知识证明简述
  8. eclipse neon php插件,Eclipse Neon安装Tomcat插件
  9. 笔记本网络带宽叠加(有线和WiFi同时使用) 2021-09-27
  10. linux mtd - mtdpart.c
  11. JSAPI支付——H5网页端调起支付接口
  12. Potplayer倍速播放声音失真(回音)
  13. input输入框type参数
  14. 不懂这些高并发分布式架构、分布式系统的数据一致性解决方案,你如何能找到高新互联网工作呢?强势解析eBay BASE模式、去哪儿及蘑菇街分布式架构...
  15. 力扣网-罗马数字转整数
  16. 从电阻丝印读取电阻阻值
  17. 自律的程序员生活是什么样的?
  18. 项目管理手记(29)ERP项目高层大力支持的冰火两重天
  19. 解决vue 不支持ie浏览器 qq浏览器的解决办法
  20. 4片74151扩展为32选1数据选择器

热门文章

  1. Improved Schemes for Episodic Memory-based Lifelong Learning 论文阅读+代码解析
  2. C#使用SqlTransaction事务回滚与SqlBulkCopy批量插入数据
  3. 基于Cocos2dx开发卡牌游戏_放开那三国
  4. 镂空遮罩(新手指引解决方案)
  5. 命令模式之做我的齐天大圣还是奉旨上界
  6. 【面经】嘉实基金-科技类-数据方向面经
  7. Nginx配置服务并开机启动
  8. oracle给用户sys权限,oracle创建用户并赋予sys角色权限
  9. oracle停数据库,oracle数据库停止命令
  10. 2018年海归计算机硕士就业前景,2018年美国留学生回国就业情况,起薪一万,最热是IT行业!...