First集合和Follow集合的求法(修改含例子)
来源:互联网 发布:python监控系统性能 编辑:程序博客网 时间:2024/06/07 05:00
对于终结符和非终结符的理解:
如:A->B,则A是非终结符;A->id,则id是终结符。
(一般书上终结符用小写,非终结符用大写。)
文法产生语言句子的基本思想:
从识别符号(开始符)开始,把当前产生的符号串中的非终结符替换为相应规则右部的符号串,直到全部由终结符组成。所以文法产生句子的基本思想就是基于产生式(例如A->num)的替换,当所有的非终结符都被终结符替换时,推导结束。
FIRST集求法:
我 对First集的理解:first集应该就是求一个表示文法的字串(一般指非终结符,终结符的first集就是它自身)开头的所有可能出现的字符的集合。 例如A->aC
求First集的步骤:
若X->a..,则将终结符a加入FIRST(X)中;
若X->e
, 则将终结符e加入FIRST(X)中(e表示空集);若 X->BC..D,则将First(B)所有元素(除了空集)加入First(A),然后检测First(B),若First(B)中不存在空集, 即e,则停止,若存在则向B的后面查看,将First(C)中所有元素(除了空集)加入First(A),然后再检测First(C)中是否有e...直 到最后,若D之前的所有非终结符的First集中都含有e,则检测到D时,将First(D)也加入First(A),若First(D)中含有e,则将 e加入First(A)。
对于第三条,其实也很好理解,就是说当X推导出一个字串时,D前面的非终结符都可能推出空串,这个时候,X推出的串的首部,就不是那些推出空串的非终结符了,而是这些推出空串的非终结符后面的文法符号所推导出的字串。
例题:设文法G(S):
S->S+aF|aF|+aF
F->*aF|*a
(1)消除左递归和左因子。
(2)构造相应的FIRST集合和FOLLOW集合。
解析:首先,第一个式子,消除左递归。S->aFS’|+aFS'。S'->+aFS'|ε (此处的ε和e一样的 不同的书上印刷的不同)
然后,第二个式子,消除左因子。F->*aF’,F'->F|ε
第三步,求各个非终结符的FIRST集合。FIRST(S)={a,+} 因为S可以导出首字母为终结符a的产生式,和首字符为+的产生式。
FIRST(S‘)={+,ε} FIRST(F)={*},FIRST(F’)={*,ε}
FOLLOW集的求法:
对Follow集,其实也差不多,它应该是指非终结符推出的字串最末端后可能出现的所有字符的集合。例如Follow(U)所表达的是句型中非终结符U所有可能的后随终结符号的集合,特别地,“$”是识别符号的后随符。注意Follow集合是从开始符号S开始推导。
求Follow集的步骤:
对文法开始符号S,置$于FOLLOW(S)中; (也就是说有关S的FOLLOW集合中,都包含$,也有书中表示为#)
对于产生式:A->aBC,将除去空集e的First(C)加入Follow(B)中; (B后面跟着的就是C的首部字符)
对于产生式:A->aB或者A->aBC,(其中C可以推导出空串,C=>*e),则将Follow(A)加入Follow(B)中。 (注意:此处a可以是空,也可以是其他文法符号);
(A->aB
注意:follow集合是要将所有的产生式都找出来,来求非终结符的follow集合。
刚刚的例题:
FOLLOW(S)={#},FOLLOW(S')={#},可以看出S和S‘ 并没有其他的末端。
FOLLOW(F)={+,#} (原因是S->aFS’|+aFS'。S'->+aFS'|ε ,由第二条,讲S和S’的FOLLOW集合加入到FOLLOW(F)中,且F后面有S‘,因此将 FIRST(S’)出去空集以外,也加入到FOLLOW(F)中 )
FOLLOW(F')={+,#},(F->*aF’,F'->F|ε,互相加入到集合中去)
- First集合和Follow集合的求法(修改含例子)
- First/Follow集合的求法
- 编译原理-First集合和Follow集合的求法
- 编译原理-First集合和Follow集合的求法
- 汇编语言中的first和follow集合的求法
- FIRST集合与FOLLOW集合求法
- 编译原理:first集合和follow集合的求法及LL(1)文法判定
- 编译原理FIRST集合FOLLOW集的求法
- 编译原理first集合和follow集合
- first、follow、select集合求法及LL1文法判别
- 预测分析表中的FIRST和FOLLOW集合求法个人小结
- First集和Follow集的求法
- First集和Follow集的求法
- FIRST集求法和FOLLOW集的求法
- LL(1)文法判别之First集合、Follow集合、Select集合求法
- FIRST集合FOLLOW集
- first、follow集合求解 (编译原理)
- 编译原理 FIRST集和FOLLOW集的求法
- Android网络通信的六种方式
- 2016苹果开发者证书无效,怎么办
- 设计模式
- tun/tap 设备
- ThinkPHP分页类的使用相关问题
- First集合和Follow集合的求法(修改含例子)
- Html+Css CSS中背景图片定位方法
- POJ 3020 Antenna Placement(二分图的最大匹配)
- 关于thinkphp中使用U方法登陆修改index.php
- [Python]网络爬虫1
- CSS盒模型——元素分类
- faad2解码aac-解决采样频率和通道数不对的问题
- 配置配置DruidDataSource
- 【SPOJ-TRANSP2】Transposing is Even More Fun【Pólya】【欧拉函数】【二进制】