一、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集相关推荐

  1. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理

    本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...

  2. 编译原理之--FIRST集、FOLLOW集 和 SELECT集

    FIRST集.FOLLOW集 和 SELECT集 一.FIRST集 FIRST(A)为A的开始符或者首符号集. 1.定义: 设G=(VT,VN,S,P)是上下文无关文法 ,FIRST(α)={a|α能 ...

  3. 文法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集.

  4. 文法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,以及构造预测分析表.

  5. FIRST集与FOLLOW集构造步骤

    首先,这两个集主语是候选式,是V*中的一个终结符/非终结符. 由于FOLLOW集的定义和构造步骤里面都涉及FIRST集,故先介绍FIRST集. 一.FIRST集的定义如下: FIRST(α)={a|α ...

  6. FIRST集、FOLLOW集 和 SELECT集

    FIRST集.FOLLOW集 和 SELECT集 一.FIRST集 FIRST(A)为A的开始符或者首符号集. 1.定义: 设G=(V T ,V N ,S,P)是上下文无关文法 ,FIRST(α)={ ...

  7. First集、Follow集

    构建First集 求First集步骤 首先,对所有非终结符A, 先设定FIRST(A)= {} (空) FIRST(A) = { t | A → tw },t为终结符,w为任意类型 然后, 对每一个产 ...

  8. 编译原理之形式语言文法分类

    高级程序设计语言的三个基本因素: 语法:描述语言成分的构成规则(包括词法规则和语法规则) 语义:描述语法成分的含义 语用:描述语法成分的使用方法 形式语言理论(formal language theo ...

  9. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

最新文章

  1. codility上的问题 (22)
  2. python打开json文件变为字典_Python json读写方式和字典相互转化
  3. 深入理解Java虚拟机(一):Java内存模型
  4. 从拼多多分享文案中,我们学会了什么?
  5. java的c import_关于编译(javac),import,package的再理解
  6. php 掌握jquery,完全掌握jquery tmpl模板
  7. 从逻辑回归到最大熵模型
  8. 基于exosip的uas-uac的一个简单例子(转载)
  9. Ubuntu系统---C++之Eclipse IDE 编译器安装
  10. 【UML】如何画好数据流图基础教程
  11. SpringAOP的实现原理
  12. 运放输入偏置电流方向_运算放大器的输入偏置电流
  13. 磁场发生装置电磁铁简介及工作原理
  14. Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced)
  15. 蜜源如何快速做到月入过万
  16. c语言 出现的#if 0 表示什么?
  17. c语言 字符串switch,C++中如何对字符串进行switch
  18. 【思考】开学第一课--大学的终结,终生学习
  19. 发电机失磁保护的整定计算
  20. 2018河南省第十一届ACM省赛之旅。。。

热门文章

  1. cod16一进单机就断开服务器无响应,使命召唤16刚登录进游戏就闪退
  2. 2021年12月中国车企新能源汽车销量排行榜:Top前三的车企销量远超于其他车企,且市场份额占比均超过10%(附月榜TOP68详单)
  3. Word Xml格式 标签说明
  4. 设计模式与足球(三)
  5. 设计模式与足球(四)
  6. 加密货币再现震荡,总市值持续减少188亿—区块链周报第十一期 原创: 陀螺财经研究院 陀螺财经 昨天
  7. DDR4 Spec 第四章 4.26-4.27
  8. (问答)50m带宽的实际速率是多少
  9. Android API AudioEffect中文API与应用实例
  10. canvas实现手写签名