编译原理:LL(1)文法的First集跟Follow集
一、FIRST集
定义:
("=*>" 符号意为“经过任意步”)
设G=(Vt,Vn,S,P),令G是一个不含左递归的文法, 对G的所有非终结符的每个候选a定义它的终结首符集First(a)为:First(a)={a|a=*>a,aa,aaa.....,a∈Vt}
特别的,若a=*>ε则规定ε∈First (a)
规则
- 如果 X 是终结符号,那么FIRST(X)={X}
- 如果 X 是非终结符号,且 X -> Y1Y2Y3…Yk 是产生式,如果a在FIRST(Yi)中,且 ε 在FIRST(Y1),FIRST(Y2),…,FIRST(Yi-1)中,那么a也在FIRST(X)中;
- 如果ε 在FIRST(Y1),FIRST(Y2),…,FIRST(Yk)中(全部都有),那么ε在FIRST(X)中;
- 如果X是非终结符号,且有X->ε,那么ε在FIRST(X)中
理解规则:
First(a)就是从a可能推导出的所有开头为终结符号和可能的ε所构成的集合。但是!如果产生式形如A→BC B→ε C→c,这时ε不在First(A)中; 假如上述产生式的 C→c|ε,这时由于B、C都能够推导出ε,所以相当于A→ε,所以这时的 ε在First(A)中!!!
eg:
有语句A->a|B|c
B->b|ε
那么First(A)为{a,b,c}
First(B)为{b,ε}
first集还是很好理解的, 就是非终结符推导出的首个终结符的所有可能的一个集合
二、Follow集
定义:
我们设S是不含左递归文法G的开始符号,对于G的任何非终结符A,我们定义
Follow(A)={a∣S⇒...Aa...,a∈Vt}
follow集求解规则:
- (1)对于文法的开始符号S,置#于Follow(s)中;
- (2)若A->aBb 是一个产生式,则把First(b)-{ϵ }加入到Follow(B)中
- (3)A->aB是一个产生式,或A->aBb是一个产生式且b=>ϵ ,则把Follow(A)加入到Follow(B)中
对于三条规则的解释:
(以定义中的产生式A->aBb举例,此时的a,b都是终结符与非终结符的集合,而不只是个终结符!!)
- 对于首先要求解的文法开始符号(如:S)的follow集我们应该将#加入到它的Follow集中
- 如果某条产生式在右边存在我们要求解follow的非终结符(如:A->aBb 中的 B ),而且非终结符后面存在终结符或者非终结符的集合(如:A->aBb 中的 b ),那么我们就将跟在该非终结符后面的符号(如:此时的 b )的First集(如果含有ϵ)去掉ϵ,再将其加入到要求解的Follow(如:A->aBb 中的 B )集合中。
- 如果某条产生式右边存在我们要求解follow的非终结符而且非终结符后面不存在终结符或者非终结符的集合(如 A->aB ); 又或者存在终结符或者非终结符的集合(如:A->aBb 中的 b )但是该集合可以推出ϵ( b=>ϵ )。那么则将该条产生式左边的非终结符的Follow集加入到要求解的Follow集中。
eg:
A->aBC|ϵ ,B->b|ϵ ,C->Ac|ϵ 此时的a,b,c为终结符,A,B,C为非终结符
这时的Follow(A)={#,c} ,
Follow(B)=Follow(A)+First(C)-{ϵ},
Follow(C)=Folllow(A)
小结
经过上面的学习此时你应该已经明白First和Follow的求解方法,如果还有不明白的可以在下方留言我会回复,也可以去找题目进行练习,在练习中查漏补缺、加深理解。如果发现我的错误还请指出,多谢。谢谢大家观看。
编译原理:LL(1)文法的First集跟Follow集相关推荐
- 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理
本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...
- 编译原理之--FIRST集、FOLLOW集 和 SELECT集
FIRST集.FOLLOW集 和 SELECT集 一.FIRST集 FIRST(A)为A的开始符或者首符号集. 1.定义: 设G=(VT,VN,S,P)是上下文无关文法 ,FIRST(α)={a|α能 ...
- 文法G[S]: S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c 求FIRST集,FOLLOW集。
文法G[S]: S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c 求FIRST集,FOLLOW集.
- 文法G[E]: E→E+T|T ,T→T*F|F ,F→i|(E) 求FIRST集,FOLLOW集
文法G[E]: E→E+T|T T→T*F|F F→i|(E) 求FIRST集,FOLLOW集,判定i+i * i,以及构造预测分析表.
- FIRST集与FOLLOW集构造步骤
首先,这两个集主语是候选式,是V*中的一个终结符/非终结符. 由于FOLLOW集的定义和构造步骤里面都涉及FIRST集,故先介绍FIRST集. 一.FIRST集的定义如下: FIRST(α)={a|α ...
- FIRST集、FOLLOW集 和 SELECT集
FIRST集.FOLLOW集 和 SELECT集 一.FIRST集 FIRST(A)为A的开始符或者首符号集. 1.定义: 设G=(V T ,V N ,S,P)是上下文无关文法 ,FIRST(α)={ ...
- First集、Follow集
构建First集 求First集步骤 首先,对所有非终结符A, 先设定FIRST(A)= {} (空) FIRST(A) = { t | A → tw },t为终结符,w为任意类型 然后, 对每一个产 ...
- 编译原理之形式语言文法分类
高级程序设计语言的三个基本因素: 语法:描述语言成分的构成规则(包括词法规则和语法规则) 语义:描述语法成分的含义 语用:描述语法成分的使用方法 形式语言理论(formal language theo ...
- 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现
编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...
最新文章
- codility上的问题 (22)
- python打开json文件变为字典_Python json读写方式和字典相互转化
- 深入理解Java虚拟机(一):Java内存模型
- 从拼多多分享文案中,我们学会了什么?
- java的c import_关于编译(javac),import,package的再理解
- php 掌握jquery,完全掌握jquery tmpl模板
- 从逻辑回归到最大熵模型
- 基于exosip的uas-uac的一个简单例子(转载)
- Ubuntu系统---C++之Eclipse IDE 编译器安装
- 【UML】如何画好数据流图基础教程
- SpringAOP的实现原理
- 运放输入偏置电流方向_运算放大器的输入偏置电流
- 磁场发生装置电磁铁简介及工作原理
- Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced)
- 蜜源如何快速做到月入过万
- c语言 出现的#if 0 表示什么?
- c语言 字符串switch,C++中如何对字符串进行switch
- 【思考】开学第一课--大学的终结,终生学习
- 发电机失磁保护的整定计算
- 2018河南省第十一届ACM省赛之旅。。。
热门文章
- cod16一进单机就断开服务器无响应,使命召唤16刚登录进游戏就闪退
- 2021年12月中国车企新能源汽车销量排行榜:Top前三的车企销量远超于其他车企,且市场份额占比均超过10%(附月榜TOP68详单)
- Word Xml格式 标签说明
- 设计模式与足球(三)
- 设计模式与足球(四)
- 加密货币再现震荡,总市值持续减少188亿—区块链周报第十一期 原创: 陀螺财经研究院 陀螺财经 昨天
- DDR4 Spec 第四章 4.26-4.27
- (问答)50m带宽的实际速率是多少
- Android API AudioEffect中文API与应用实例
- canvas实现手写签名