First集、Follow集
构建First集
- 求First集步骤
首先,对所有非终结符A, 先设定FIRST(A)= {} (空)
FIRST(A) = { t | A → tw },t为终结符,w为任意类型
然后, 对每一个产生式A → Bw, B为终结符,循环以下步骤(递归)
- FIRST(A) = FIRST(A) ∪FIRST(B)
- 当FIRST 集合不再发生变化时,算法终止.
- 产生式如下
E → TE’
E’ → +TE’ | ε
T → FT’
T’ → *FT’ | ε
F → (E) | id
- 求First集详细步骤:
- 第一步填表:
E | E’ | T | T’ | F |
---|---|---|---|---|
First(T) | + | First(F) | * | ( |
ε | ε | id |
- 开始递归填表:
E | E’ | T | T’ | F |
---|---|---|---|---|
( | + | ( | * | ( |
id | ε | id | ε | id |
插入一个注意事项
若是如下产生式:
注意到
A → Da
,因为D能产生ε
,所以First(Da) = {b,a}所以First(A) = {ε,a,b}
同理可得First表格
构建Follow集
求Follow集步骤
产生式如下
(1)E → TE’
(2)E’ → +TE’ | ε
(3)T → FT’
(4)T’ → *FT’ | ε
(5)F → (E) | id
上面求得的First表如下:
E E’ T T’ F ( + ( * ( id ε id ε id 求Follow集步骤
Follow(E)= {$}(结束符)
(1)E → TE'
可以看成:E → εTE'
、E → TE'ε
由
E → εTE'
可分析:- Follow(T)= First(E’)- {ε},又因为ε属于First(E’),所以Follow(T)并入Follow(E);
由
E → TE'ε
可分析:- First(ε) = {ε}
- Follow(E‘) = First(ε) - {ε} = {}(空集),又因为ε属于First(ε),所以Follow(E’)并入Follow(E)
第一次填表得:
E E’ T T’ F $ Follow(E) First(E’)- {ε} Follow(E) (2)E' → +TE' | ε
可以看成E' → +TE'
、E' → +TE'ε
:由
E' → +TE'
分析得:- 只能求得Follow(T) = First(E’)- {ε},又因为ε属于First(E’),所以Follow(T)并入Follow(E’)
由
E' → +TE'ε
分析得:- Follow(E’) = First(ε) - {ε} = {}(空集),又因为ε属于First(ε),所以Follow(E’)并入Follow(E’),
相当于没有
, - 注:递归自己直接不填表,不然程序陷入死递归。
- Follow(E’) = First(ε) - {ε} = {}(空集),又因为ε属于First(ε),所以Follow(E’)并入Follow(E’),
第二次填表得:
注:重复的不写
E E’ T T’ F $ Follow(E) First(E’)- {ε} Follow(E) Follow(E’) 后面分析省略,只写出填表步骤,每次分析一条产生式填一次表:
分析
(3)T → FT'
,第三次填表:E E’ T T’ F $ Follow(E) First(E’)- {ε} Follow(T) First(T’) - {ε} Follow(E) Follow(T) Follow(E’) 分析
(4)T' → *FT' | ε
,第四次填表:E E’ T T’ F $ Follow(E) First(E’)- {ε} Follow(T) First(T’) - {ε} Follow(E) Follow(T) Follow(E’) Follow(T’) 分析
(5)F → (E) | id
,第五次填表:E E’ T T’ F $ Follow(E) First(E’)- {ε} Follow(T) First(T’) - {ε} ) Follow(E) Follow(T) Follow(E’) Follow(T’) 开始递归,最后完成表格:
首先引用
First
表E E’ T T’ F ( + ( * ( id ε id ε id 递归调表
Follow
表结果E E’ T T’ F $ ) + + * ) $ ) ) + $ $ ) $
First集、Follow集相关推荐
- 编译原理 First集 Follow集 select集 通俗易懂的讲解 + 实例
#First集Follow集通俗易懂的讲解加实例 ##First 如A->aB | CD 这里面包含了组成First(A)的两种情况: 以终结符开头,当然要把这个终结符(a)放到A的First里 ...
- C++实现first集follow集
1."@"代替字符"ε" 2.同一非终结符如有多条产生式必须写成一行,中间用"|"分隔,不允许有空格 代码存在很多问题,大量"非正 ...
- 编译原理 求first集 follow集
FIrst集: FIRST集是一个文法符号串所可能推导出的符号串的第一个终结符的集合 First集合最终是对产生式右部的字符串而言的,但其关键是求出非终结符的First集合,由于终结符的First集合 ...
- FIRST集和FOLLOW集的计算
文章目录 `FIRST`集的计算 计算`FIRST(x)` 具体算法 计算`$X_21,X_2,X_3,...,X_n$`的`FIRST`集 FOLLOW集的计算 算法 FIRST集的计算 计算FIR ...
- 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现
编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...
- FIRST集与FOLLOW集构造步骤
首先,这两个集主语是候选式,是V*中的一个终结符/非终结符. 由于FOLLOW集的定义和构造步骤里面都涉及FIRST集,故先介绍FIRST集. 一.FIRST集的定义如下: FIRST(α)={a|α ...
- 编译原理-First集和Follow集
刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法: ...
- FIRST集和FOLLOW集的构造
FIRST集和FOLLOW集的定义 注意:1:FIRST集的定义中\(\alpha和\beta\)可以是终结符也可以是非终结符.2:FOLLOW集的定义中\(\mu和\beta\)可以是终结符也可以是 ...
- 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理
本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...
最新文章
- rabbitmq怎样确认是否已经消费了消息_【朝夕专刊】RabbitMQ生产者/消费者消息确认...
- 双系统隐藏d盘linux,如何实现双系统的相互隐藏
- 制作放两个小图片的按钮 - 回复 xhui 的问题
- 【转】什么是SIEM?
- win2008r2 AD用户账户的批量导入方法
- mysql order by按照汉字拼音进行排序
- BZOJ3592 : Architext
- Android 系统(256)---camera如何dump image buffer大全
- 苹果CarPlay新功能上线,老司机们更方便了
- 0817JavaScript--------------循环语句
- CSS3中的transform-origin的用法以及与perspective、perspective-orgin的不同
- Javascript异步操作(Promise)
- 老师常用选择题,选择框,单选框,以及各行业产品配置表单选配置明细等
- 解决dll load failed while importing qtgui
- 涂料价格上涨原因剖析
- day2_python年会抽奖游戏
- 通过网易财经爬取股票数据
- 核磁共振谱仪定义、发展及基本原理
- pdf格式转换成jpg转换器
- 690-文件管理和文件系统
热门文章
- java 数组协变_java 数组协变
- 软件开发计划_软件开发的流程是怎么样的?福州IT告诉你:这五点是你需要掌握的...
- uni-app 获取手机状态栏高度
- matlab车流量检测,求解释代码,一段交通车流量检测的代码
- steam怎么设置邮箱令牌_steam盗号?这样做50%能够避免损失!
- 使用 rem 设置文字大小(文字响应式)
- 实验:添加AXI IP到设计
- JVM笔记1:Java内存模型及内存溢出
- 如何使用Windows Live Alerts服务
- Intellij idea 设置关闭自动更新