龙空技术网

编译原理中FIRST集和FOLLOW集是什么东西?

与你邀约望三星 71

前言:

现时朋友们对“ll1文法的分析c语言”大致比较讲究,我们都想要学习一些“ll1文法的分析c语言”的相关内容。那么小编在网摘上收集了一些对于“ll1文法的分析c语言””的相关知识,希望大家能喜欢,大家一起来了解一下吧!

编译原理中有FIRST集和FOLLOW集这两个概念让初学者很头疼,尤其是在用数学符号表示的时候,看起来比较复杂。下面我们用简单的语言对这两种集合来描述一下这两种集合的情况。

当采用自顶向下的分析方法的时候必须判别所给的文法是否是LL(1)文法。

LL(1)文法:第一个L表示从左到右扫描输入串,第二个L表示生成的是最左推导

所以对给定的文法需要计算FIRST、FOLLOW、SELECT集,进而判断文法是否为LL(1)文法。这里我们用简单的语言来介绍求FIRST集和FOLLOW集的方法。

FIRST集:所给定的文法符号的串首终结符。

这里介绍一下串首终结符的概念。串首即所给串的第一个,而终结符的意思就是不能再向下推出任何东西的符号。在编译原理中一般使用小写字母来表示终结符。相反的我们可以知道非终结符的意思就是可以继续往下推的符号。

举一个简单的例子:

S->aB("->"表示定义为)

对上述S来说FIRST(S)即为a

那么如果是下面的情况呢

S->AB

可以发现FIRST(S)并不能直接得到答案,因为有一个可以继续向下推的非终结符A,因此这里我们就要考虑A的情况了。当然很容易发现如果A能够推出终结符,那么FIRST(S)就为FIRST(A)了。如果A推出了非终结符,那么我们仍然要考虑A推出的非终结符能够推出的情况。如果A->ε(ε表示空串)即我们就要考虑A后面的符号B能推出的情况。如果B->ε,那么这个时候S推出的结果就是从FIRST(A)去掉ε这种情况(在考虑到A不止推出ε还能推出其它的内容的情况下),之后并上ε即可。

说完了FIRST集,下面我们来介绍一下FOLLOW集

在英语中FOLLOW的意思是跟随。在这里求FOLLOW集的时候我们也可以用这样的想法来进行理解。FOLLOW集即为跟在后面的第一个元素。注意,这里出现了第一个元素这样的字眼,是不是感觉有点似曾相识呢?没错,这个就和我们刚才讲的FIRST集的概念串联到一起了。那么问题来了,难道FIRST集和FOLLOW集一样吗?

当然不一样!

在我们求FOLLOW集时我们要从里面来看,而不是从文法定义的符号串来看的

比如

S->Xb,X->aYB

在这里就有FOLLOW(X)=b(因为b是X后面跟着的第一个)。

而根据定义可以知道FOLLOW(Y)=FIRST(B)

那么问题出现了,当FIRST(B)为ε的时候我们该怎么办呢?其实很简单。这里因为是由X定义为的aYB,所以这里的FOLLOW(Y)当B为ε的时候就自然变成了X后面的第一个数,写成集合形式就是FOLLOW(X)了。即此时FOLLOW(Y)=b。

标签: #ll1文法的分析c语言 #编译原理follow算法 #编译原理follow怎么求