对FIRST集,FOLLOW集,的例题讲解。

来源:互联网 发布:齐鲁证券交易软件 编辑:程序博客网 时间:2024/05/18 01:24

这里写图片描述
对这个求FIRST集
求FIRST集其实看定义真的是可以让人晕死,这里有几个规则(我查看了很多的资料文档以后的结果):
1:看推导是否有|,如果有,那么两端的第一个都要看
2:对于第一个元素,如果是终结符那么就直接有那个终结符在FIRST(X)中,如果不是终结符那么看推导式是否包含空字符串,如果包含,那么这个符号的下一个也要看。
这里就拿FIRST(B)做一个讲解:
1:B一开始的第一个有e这个终结符所以就算是一个元素
2:第二组里面有一个S,我们跟入S发现S有空字符串,同时也包含了a这个终结符
3:由于S包含了空字符串所以后面的A也要看,那么A呢?A包含了它自己,他自己有空字符串,所以这时我们又要看S
4:有上面的分析我们其实是知道的FIRST(S)={a,空字符串符}所以这个时候的A其实有了a和空字符串了,由于S又有空字符串,所以d也要看,d就是一个终结符,所以此时我们的FIRST(A)={a,d,空字符串符}
5:回到我们的B的分析中,由于A有空字符串所以h也要看,h就是一个终结符,所以现在的FIRST(B)={e,a,d,h}
6:再看最后一个的第一个是要给终结符——空字符串所以这个时候的FIRST(B)={e,a,d,h,空字符串符}
最后给上答案:
这里写图片描述
(题目来源于百度贴吧,答案是我自己撰写的,原帖地址:http://tieba.baidu.com/p/1168749123,如侵删)

对于FOLLOW则有以下规则:
(1)、对文法的开始符号S,将“#”加到FOLLOW(S)中;
(2)、若A->aBb是一条规则,则把FIRST(b)中的非ε元素加到FOLLOW(B)中;
(3)、若A->aB或A->aBb是一条规则且b=>ε,则把FOLLOW(A)加到FOLLOW(B)中;
(4)、反复使用(2)、(3),直到每个非终结符的FOLLOW集不再增大为止。
例题:
设有文法G[A]:
A→BCc | gDB B→bCDE |ε C→DaB | ca D→dD |ε E→gAf|c
一开始我们要先求FIRST集
FIRST(A)={b,a,d,c,g}
FIRST(B)={b, ε}
FIRST(C)={d,a,c}
FIRST(D)={d,ε}
FIRST(E)={g,c}
然后就开始求FOLLOW集
先求FOLLOW(A)
我们发现,有E→gAf|c,所以根据第二条我们直到FIRST(f)是属于FOLLOW(A)的,然后由1我们知道FOLLOW(A)={f,#}
求FOLLOW(B)
我们发现,
有A→BCc | gDB我们由2知到FIRST(C)属于FOLLOW(B),由3我们知道FOLLOW(A)属于FOLLOW(B),
有 C→DaB我们由3直到知道FOLLOW(C)属于FOLLOW(B),此时我们发现要求FOLLOW(C)
那么就顺带来求FOLLOW(C),
有B→bCDE我们由2知道FIRST(D)属于FOLLOW(C),由于在B→bCDE中D有ε所以FIRST(E)也属于FOLLOW(C),
有A→BCc由2我们知道FIRST(c)属于FOLLOW(C)那么结合上面的FIRST信息我们知道:
FOLLOW(C)={d,c,g,#}
FOLLOW(B)={f,d,c,a,g,#}
求FOLLOW(D)
有A→BCc | gDB 由2我们知道FIRST(B)属于FOLLOW(D)由3我们知道FOLLOW(A)属于FOLLOW(D)
有B→bCDE由2我们知道FIRST(E)属于FOLLOW(D)
有C→DaB由2我们知道FIRST(a)属于FOLLOW(D)
所以我们知道:
FOLLOW(D)={g,c,a,b,f,#}
求FOLLOW(E)
有B→bCDE由3所以我们知道FOLLOW(B)属于FOLLOW(E)
FOLLOW(E)={f,d,c,a,g,#}
这里值得注意的是,在求FOLLOW(C)时有B→bCDE我们因为D->ε我们很容易推到3但是要注意后面是跟了一个E的,E无法得到E->ε所以第三条的后面那一句且b=>ε不成立。无法使用3
原帖地址:
http://foreverfriend.blog.163.com/blog/static/234666021201442510622936/

原创粉丝点击