提示:学习本文章之前,建议先学会FIRST集。因为求FOLLOW集经常要用到FIRST集。

提示:本文建议先看例题,有不懂的地方再结合相应的文字部分。

怎么求FIRST集?

先讲3个概念:
非终结符就是大写字母。
终结符就是非终结符以外的所有符号(注意是符号,而不只局限于字母,终结符包括小写字母,数字,加号,减号,逗号等等)。
代入:对于产生式S → ABc, 箭头两侧是等价的,当箭头右部出现S时,就可以用ABc等价代替,可以方便地称为“代入”,这个做题时很好用。代入是用箭头右部代替左部,不能用左部代替右部。

为什么叫FOLLOW集?

follow的意思就是“跟随”。所以求符号A的FOLLOW集,就是求出这个符号A后面能跟些什么,也就是求跟随A的元素都有哪些。注意,并不是跟在A后面的所有元素都是它的FOLLOW集,我们只要A后面的与A能够相邻的注意这里的用词,是“ 能够相邻的 ”,而不是“ 相邻的 ”,有什么不同呢?可以理解为“ 相邻的 ”是“ 能够相邻的 ”的子集。比如给出这样一个串“ ADBfj ”,f本来并不与A相邻,但我可以通过D → ε使原来的串变为“ ABfj ”,那么继续再加一个式子B → ε使得式子变成“ Afj ”,也就是通过一系列代入 f 成功上位成为了A的小跟班,从此过上了FOLLOW集的生活。
这里先简单了解一下,等会再回来看,下面步入正题。

怎么求FOLLOW集?

给出文法如下:
S → ABc
A → a|ε
B → b|ε

每一个文法都一定有一个开始符号。开始符号一般是一个非终结符,那么怎么找开始符号呢?
开始符号特点:出现在箭头左侧
就拿上面的文法举例,出现在箭头左侧的有S,A,B,其中在箭头左侧出现的只有S,所以S是开始符号。
注意:如果是增广文法,里面会有一句文法,形如S’ → S,箭头右侧的就是开始符号,也就是S(这个在学FOLLOW集阶段用不到,但在后面学LR(0)自动机时会遇到,现在可以作为了解)。
求FOLLOW集的步骤:
0.如果文法是增广文法,先去掉S’->S这个式子,在剩下的文法中求FOLLOW集(初学者先忽略,不影响)。
1.找开始符号。
2.在开始符号的FOLLOW集中写入#(或者$),这是规定。
3.对所有非终结符逐个分析,分析能不能最终推出ε,也就是“非终结符 → ε”的形式,将这些非终结符列举出来。

对步骤3举例:
S → AB
A → a|ε
B → b|ε
S最终能够推出 ε。因为S → AB, 而A → ε,所以变成了S → B,又因为B → ε,所以变成了S → ε。当然,显而易见本题A和B也能最终推出ε。
这个过程并不难理解,只是有些繁琐,一步一步代入即可。

注意:
接下来的所有步骤都只需在箭头右部找。

4.找出含有所求符号的所有式子。(只在箭头右侧部分中找)
5.对步骤4的每个式子单独分析,找出这个串中与所求符号能够相邻的所有符号(只找右相邻的,不找左相邻);但有的式子中所求符号就在最右侧,右边就没有任何相邻的,这种情况用步骤6解决。

记住这是步骤5,因为需要再看一遍上面的“ 为什么叫FOLLOW集 ”那一段文字。

6.分析这些能够相邻的符号,如果是终结符,直接写入所求符号的FOLLOW集;如果是非终结符,将该非终结符的FIRST集写入所求符号的FOLLOW集。(注意FOLLOW集中不能出现ε ,所以将FIRST集写入FOLLOW集时注意去掉ε,这是规定
7.如果有的式子中所求符号就在最右侧。把这个式子箭头左侧符号的FOLLOW集写入所求符号的FOLLOW集中,如果箭头左侧就是所求符号,那么就不用写任何东西。
7.对,这一步仍然是第7步。十分的特殊。这个特殊性就和上面提到的 “ 相邻的能够相邻的 ”一样。这里是“最右侧能够最右侧”。最右侧就是上面那个第7步讲的。那么“能够最右侧”是什么意思呢?其实就是本来不是在最右侧,不过经过一系列代入后,就能够变成最右侧。

步骤7“能够最右侧”例题:
S → BH
H → a
H → ε
B → b

直观的看,现在B不是最右侧的情况,不过因为 H → ε ,代入S → BH中得到S → B,这就变成了“最右侧”。
那么,做题的时候我就都要代入挨个的试吗?并不是的:首先,如果B右侧的串存在终结符,那么最终B一定不会成为“最右侧”,比如S → BHe此时不用代入。那如果全是非终结符怎么办?比如S → BHYJI , 因为第3步列举了一些非终结符,如果B右侧的串中存在这些非终结符以外的符号,同样也不会变成“最右侧”。不满足以上这两条,就是B最终“能够最右侧”。由此可见第3步的重要性。
想知道为什么吗?按照这个步骤多做题,很快就能思考出来,现在先跟着我做道例题。

最后强调一点:FOLLOW集不能出现ε
最最后强调一点:FOLLOW集不能出现ε
重要的事情说三遍:FOLLOW集不能出现ε

这7条步骤先浏览一遍即可,结合实践,在做题中学习理解,上例题。

例题:已知文法G和FIRST集,求FOLLOW集

终结符 FIRST集
S d,e,ε,b,a
H e,ε
K d,ε
L e
M d,ε,b

题目文法等价于:
S → MH
S → a
H → LSo
H → ε
K → dML
K → ε
L → eHf
M → K
M → bLM
按照上面的步骤来:
1.开始符号是S
2.FOLLOW(S)={#}
3.最终能推出ε的非终结符有:S , H , K , M。如果有疑问,去读一下上面的步骤3举例那个例子。

先求S的FOLLOW集
4.含有S的式子有:H → LSo
5.能够相邻的只有o
6.o是终结符,FOLLOW(S)={#,o}
再求H的FOLLOW集
4.含有H的式子有:S → MH , eHf
5.能够相邻的有f
6.f是终结符,FOLLOW(H)={f}
7.S → MH中H在最右部,FOLLOW(H)={f , FOLLOW(S)} , 将FOLLOW(S)代入即可。FOLLOW(H)={#,o , f}
求K的FOLLOW集
4.含有K的式子有:M → K
5.没有相邻的
6.
7.M → K中K在最右侧,FOLLOW(K)={ FOLLOW(M) },因为FOLLOW(M)还没有求出来,等会再代入。
求L的FOLLOW集
4.含有L的式子:H → LSo,K → dML,M → bLM
5.能够相邻的:S,o , M
6.o是终结符,写入L的FOLLOW集;S,M都是非终结符,将FIRST(S)和FIRST(M)写入L的FOLLOW集。(除去ε )
7.根据K → dML,将FOLLOW(K)写入FOLLOW(L), 对于M → bLM,因为L的右侧有非终结符M,且M出现在步骤3里面,所以M → bLM可以写成M->bL,所以将FOLLOW(M)写入FOLLOW(L)。因为FOLLOW(M)还没有求出来,等会再代入。
求M的FOLLOW集
4.含有M的式子:S → MH, K → dML, M → bLM
5.能够相邻的:H, L
6.将FIRST(H)和FIRST(L)写入FOLLOW集。(除去ε )
7.M → bLM,因为箭头左侧就是M,所以不用写。但是通过S → MH,可以得到S → M,所以将FOLLOW(S)写入。
最终答案见下表:

非终结符 FOLLOW集
S # , o
H #,o , f
K e , # , o
L a , b , d , e , o, #
M e , # , o

练习题:

答案:

编译原理(龙书第二版)--怎么求FOLLOW集相关推荐

  1. DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

    在开场白之前的说明: 这是"DirectX 9.0c游戏开发手记"的第一部分,叫做"'龙书'第二版学习笔记",讲的是我做"龙书"第二版(原名 ...

  2. 靠!龙书第二版两天前上架了

    更新,原来书预定于8月31号上架.现在只能预订.一不小心,预订了两本书,被天杀的Amazon压货了. 这里有卖.每个写过编译器的老大都知道这本书吧?不要告诉我你的龙书没有翻起毛边. 好消息是,龙书第二 ...

  3. 编译原理(龙书第二版)--怎么求FIRST集

    提示:建议先看例题,有不懂的地方再结合相应的文字部分. 怎么求FIRST集 什么是FIRST集?可以这么理解,first的意思是第一,首个的.所以FIRST集就是 " 箭头右侧首个终结符的集 ...

  4. 《编译原理-龙书》练习第4章

    4.2 上下文无关文法 **4.2.7节中L={a^nb^n|n>=1}怎么用文法表示? S -> aAb A -> ab| ε 4.2.1 1) E -> EE* -> ...

  5. 编译原理 龙书 笔记

    DFA NFA CFG DFA的定义: A = ( Σ, S, s0, F, N ) Σ: 输入字母表(alphabet),是一个输入字符的集合. S:状态的集合s0: 初始状态F:终止状态集合 F ...

  6. 《编译原理-龙书》练习第2章

    第2章 一个简单的语法制导翻译器 2.2 语法定义 主要描述了"上下文无关文法" 2.2.1 1) S1 = aa+ S2 = S1a* 2)              * + a ...

  7. 《编译原理-龙书》练习第3章

    3.1 词法分析器的作用 3.1.1          float     limitedSquare     (      x     )     {     float     x     ; r ...

  8. 编译原理 龙书第4章 作业3

    4.2.1 考虑上下文无关文法: S→S S + | S S * | a, 以及串aa+a* 1)给出这个串的一个最左推导 S→S S * →S S + S * →a S + S * →a a + S ...

  9. 《Three.js 开发指南》源码示例说明以及在线demo(原书第二版)附第三版的代码下载

    <Three.js 开发指南>基于原书第二版 源码来自华章出版社官网随书源码,修改替换了其中不能跑的示例,保证每个demo都可以运行. 源码以及示例说明下载: git下载地址 huazha ...

  10. dx12 龙书第二十章学习笔记 -- 阴影贴图

    对于龙书这本入门级别的书籍来说,我们仅关注于基本的阴影贴图算法.而像级联阴影贴图(cascading shadow map)[Engel06]这种效果更佳却也更为复杂的阴影技术,实则都是由这基本的阴影 ...

最新文章

  1. 中文短文本相似度:WMD
  2. 深度学习奠基人特伦斯:美国学界已经找到了解释人工智能“黑盒子”的方法...
  3. 浅析网站优化工作具体包括哪些内容?
  4. cocos2d_android 瞬间动作
  5. php5.2 get漏洞,ThinkPHP 5.x 远程代码getshell漏洞分析
  6. opencv 直方图反向投影
  7. vue地址栏输入路由跳转到首页_Vue路由跳转到新页面时 默认在页面最底部 而不是最顶部 的解决...
  8. gcc mips64编译后无法运行在octeon上运行_V 语言运行hello world程序
  9. 【JavaFx】eclipse搭建JavaFx开发环境
  10. 您的设备不支持googleplay服务_google play下载-google play下载安卓
  11. Hive 开窗必需掌握的rankdense_rankrow_number
  12. 海康rtsp视频流媒体服务器搭建(去除flash插件):rtsp > nginx-rtmp > http-flv > flv.js
  13. 嵌入式单片机STM32原理及应用
  14. 学生信息管理系统-结构体编写
  15. matlab零序五次谐波,基于5次谐波的小电流接地系统故障选线方法仿真与分析.docx...
  16. R语言ggplot2可视化为轴标签添加下标实战:符号下标、百分比下标、带括号的下标
  17. 【Reproduced】modbus4j userguide
  18. easy excel date 类型解析报错_两个日期相差多少天,你还在一天天的数吗?用Excel轻松完成计算...
  19. mysql 从句_SQL中HAVING从句的用法_MySQL
  20. 2023美国大学生数学建模竞赛A题详细公式和代码分享

热门文章

  1. PostgreSQL安装 弹出Error running
  2. 树莓派Ubuntu21.04 罗技键盘和鼠标重启后失效问题解决
  3. RK3066和AML8726-MX方案对比 频率与功耗 / 性能 / 方案成本
  4. 2021-2027全球与中国零售空间规划软件市场现状及未来发展趋势
  5. 三亚科技创新创业大赛完美落幕,珈和科技等五个企业获一等奖
  6. OSPF区域划分和区域间路由(三类LSA)
  7. printf二进制输出
  8. 这样的生产计划与排产,我看行
  9. 本地telnet使用
  10. 计算机主机后面的usb哪个不可接入,电脑的USB接口不能使用了怎么回事?主板usb接口全部失灵的解决方法...