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推出的串的首部,就不是那些推出空串的非终结符了,而是这些推出空串的非终结符后面的文法符号所推导出的字串。

 

FOLLOW集的求法:

 

对Follow集,其实也差不多,它应该是指非终结符推出的字串最末端后可能出现的所有字符的集合。例如Follow(U)所表达的是句型中非终结符U所有可能的后随终结符号的集合,特别地,“$”是识别符号的后随符。注意Follow集合是从开始符号S开始推导。

 

求Follow集的步骤:

  1. 对文法开始符号S,置$于FOLLOW(S)中;

  2. 对于产生式:A->aBC,将除去空集e的First(C)加入Follow(B)中;

  3. 对于产生式:A->aB或者A->aBC,(其中C可以推导出空串,C=>*e),则将Follow(A)加入Follow(B)中。

(注意:此处a可以是空,也可以是其他文法符号);

 对第二条步骤的理解:Follow(B)是B推出的串末端后的字符集合,在A->aBC的情形下,B推出串末端后的字符集,也就是C推出串首部字符的集合,即First(C)中除去e的集合。

对于第三条,其实也比较好理解,A->aB ,那么A推出字串的末端后字符集合,与B推出字串的末端后字符集合,是等价的。

 

下面有一个用C++实现的求First集合Follow集的程序,写的不怎么样,如有需要可供参考一下。

http://pan.baidu.com/share/link?shareid=141280&uk=1158831200

 


编译原理中,FirstFollow是用于构造语法分析表的两个重要概念。其中,First是指文法符号串中第一个终结符号的集合,而Follow是指在文法符号串中某个非终结符号后面可能出现的结符号的集合。下面是它们的求法: 1. First求法: - 如果X是一个终结符号,则First(X) = {X}。 - 如果X是一个非终结符号,则将X产生的所有符号串的First集合并,即First(X) = First(α),其中X → α。 - 如果X可以推导出ε,则将ε加入First(X)中。 2. Follow求法: - 对于文法的开始符号S,将#加入Follow(S)中。 - 对于文法中的每个产生式A → αBβ,将Follow(A)加入Follow(B)中。 - 对于文法中的每个产生式A → αB,或者产生式A → αBβ且ε∈First(β),将Follow(A)加入Follow(B)中。 下面是一个综合例子,求解文法符号串E的FirstFollow: ``` E → TE' E' → +TE' | ε T → FT' T' → *FT' | ε F → (E) | id ``` - 求解First(E): - First(T) = {(, id)} - First(E') = {+, ε} - First(E) = First(T) ∪ First(E') = {(, id, +, ε)} - 求解Follow(E): - 将#加入Follow(E)中。 - 对于产生式T → FT',将Follow(T)加入Follow(T')中,即{(, id, +, #)} - 对于产生式E → TE',将Follow(E)加入Follow(T),即{(, id)} - 对于产生式T' → *FT',将Follow(T')加入Follow(F),即{*, (, id)} - 对于产生式E' → +TE',将Follow(E')加入Follow(T'),即{+, *, (, id)} - 对于产生式F → (E) ,将Follow(F)加入Follow(E'),即{+, *, ), #, (, id} - 对于产生式F → id ,将Follow(F)加入Follow(E'),即{+, *, ), #, (, id}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值