Frist集和Follow集的定义课本上说的对于我们这些学渣来说真的像天书一样晦涩难懂,我就不要复制课本上的定义了,看我这篇文章的基本上是为了过期末考试,我就很简单的给大家说一下,根据老师布置的作业当作例子和大家交流一下哈。
在说Frist集和Follow集之前首先和大家说一下终结符和非终结符的区别,在编译原理中,规定(王八的腚-----规定)大写的字母为非终结符,例如A,B,Z,X,小写的字母和一些符号为非终结符,例如a,c,d,x,z,(,),*,&,^,%,$,#,@,+,-,等等。
知道了这些知识,接下来的操作就很简单啦。
Frist集
Frist集指的是这个集合中的第一个非终结符,记住一定是非终结符。
Frist集有下面这两个情况:
- 如果集合中的第一个字母就是小写字母或一些符号,那么它就是这个集合的Frist集。
- 如果集合中的第一个字母是大写字母,就要看这个大写字母的Frist集是什么,如果还是大写字母,就要继续往下看,知道遇到非终结符,这里有点嵌套的意思。
这就是Frist集的一些情况,接下来看一个例子,遮这样能更好的知道我说的到底是个什么东西。
**1.**用算法求下述文法的每个非终结符的Frist集
S->Ap
S->Bq
A->a
A->cA
B->b
B->dB
解:
思路:
首先我们可以从上到下可以看出,上面的第一个字母,都是大写字母,为非终结符,这里给大家介绍一个小方法,从下面开始计算,因为下面第一个是非终结符,容易计算,
这样我们很容易的就知道Frist( B->dB)={d},对吧,是不是很简单呢,哈哈哈。
我们想的时候是从下面,开始写,但是我们最终要呈现出来的还得是从上往下进行写。
我们知道了 B->dB 的Frist集为Frist( B->dB)={d},但是我们再往上看,会看到 B->b ,也是非终结符B推出来的,这样我们可以把这两个候选式的Frist集写到一块去。
原来是:Frist( B->dB)={d}
Frist( B->b)={b}
变成这个样子:
Frist(B)={d,b}
然后通过这种方法就知道了A的Frist集怎么去做了,这里就不多加去陈述了。
接下来我们看S的Frist集怎么去做:
首先看S->Bq
这个候选式的Frist集为B,但是根据定义我们知道,Frist集不能为非终结符,要为终结符,所以这里我们要看B的frist集是什么,之前我们已经进行了计算知道了Frist(B)={b,d},所以Frist(S->Bq)={b,d}。
Frist(S->Ap)的计算方法和上面的是一样的,同样留给大家去解决。
Follow集
Follow集的计算方法有点麻烦,但是理解起来也是非常简单的,我首先列举一下求Follow集的几种情况。
求Follow集的最重要的是产生式的右边,是谁把要求Follow集的那个推出来的。
- 开头加#
- 如果要求的非终结符的后面跟着一个终结符,那么把这个终结符加到该非终结符的Follow集中去。
- 如果求的非终结符的后面是非终结符就要把后面非终结符的非空Frist集加到该终结符的Follow集中去。
- 如果求的非终结符后面没有任何符号,就要看是哪个非终结符把它推出来的,就把这个非终结符的Follow集加到要求的非终结符中去。
下面我们来看具体的例子,有助于理解。
S->Ap
S->Bq
A->a
A->cA
B->b
B->dB
求Follow(S),首先想,S是第一个,要加上#,对应情况第一条,然后再看谁把S推出来的(看产生式的右边),发现没有,那么Follow(S)={#}。
求Follow集就从上往下看就可以了。
求Follow(A),首先是从上往下看,谁把A推出来的。
1.首先是S->Ap,在这个产生式中A后面有一个终结符p就把字母p加到Follow(A)中去,对应第一种情况,
2.还有就是A->cA,A推出来了A,本身推本身没有任何意义。
所以Follow(A)={p}
在这里要注意的是只有要求的非终结符后面没有任何东西的时候才能看产生式右边。
Follow(B)的做法和上述一样,这里就不多陈述。
最后希望大家都能期末过过过!!!
有问题评论区指出,我会积极改正的。
这是我的个人微信号:
本人的一个小小的公众号,如果不喜欢再这看可以去公众号哟:
感谢支持。