转First集合和Follow集合的求法(修改含例子)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

转First集合和Follow集合的求法(修改含例⼦)
对于终结符和⾮终结符的理解:
终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进⾏推导。

⾮终结符:不是终结符的都是⾮终结符。

如:A->B,则A是⾮终结符;A->id,则id是终结符。

(⼀般书上终结符⽤⼩写,⾮终结符⽤⼤写。


⽂法产⽣语⾔句⼦的基本思想:
从识别符号(开始符)开始,把当前产⽣的符号串中的⾮终结符替换为相应规则右部的符号串,直到全部由终结符组成。

所以⽂法产⽣句⼦的基本思想就是基于产⽣式(例如A->num)的替换,当所有的⾮终结符都被终结符替换时,推导结束。

FIRST集求法:
我对First集的理解:first集应该就是求⼀个表⽰⽂法的字串(⼀般指⾮终结符,终结符的first集就是它⾃⾝)开头的所有可能出现的字符的集合。

例如A->aC | bB | cD,根据这个产⽣式,就可以知道,⾮终结符A,被替换后,它开头可能出现字符有a、b 、c, 所以 {a,b,c}是
First(A)的⼀个⼦集。

求First集的步骤:
1. 若X->a..,则将终结符a加⼊FIRST(X)中;(注意⾮终结符的情况)
2. 若X->e ,则将终结符e加⼊FIRST(X)中(e表⽰空集);
3. 若 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集的步骤:
1. 对⽂法开始符号S,置$于FOLLOW(S)中;(也就是说有关S的FOLLOW集合中,都包含$,也有书中表⽰为#)
2. 对于产⽣式:A->aBC,将除去空集e的First(C)加⼊Follow(B)中; (B后⾯跟着的就是C的⾸部字符,注意如果是终结符也要搞
上)
3. 对于产⽣式:A->aB或者A->aBC,(其中C可以推导出空串,C=>*e,即空串属于C的first集合),则将Follow(A)加⼊Follow(B)中。

(注意:此处a可以是空,也可以是其他⽂法符号);
(A->aB ,那么A推出字串的末端后字符集合,与B推出字串的末端后字符集合,是等价的。


注意: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|ε,互相加⼊到集合中去)。

相关文档
最新文档