FIRST集、FOLLOW集 和 SELECT集

FIRST集、FOLLOW集 和 SELECT集

一、FIRST集

FIRST(A)为A的开始符或者首符号集。

1、定义:

设G=(VT,VN,S,P)是上下文无关文法 ,FIRST(α)={a|α能推导出aβ,a∈VT,α,β∈V*}   
特别的,若α能推导出ε,则规定ε∈FIRST(α).

2、根据定义求解FIRST集对每一文法符号XV计算FIRST(X)):

①.XVT,则FIRST(X){X}(简单讲,终结符的FIRST集就是它本身)


.XVN,且有产生式Xa…,aVT,则aFIRST(X)X→ε,则ε∈FIRST(X)。 (简单讲,若是非终结符X,能推导出以终结符a开头的串,那么这个终结符a属于FIRSTX),若X能够推导出空符号串ε,那么空符号串ε也属于XFIRST集)

③.XY…是一个产生式且YVN则把FIRST(Y)中的所有非空符号串ε元素都加入到FIRST(X)中。(这个可以理解吧)


④.XVNY1Y2,…,YiVN,且有产生式XY1Y2Yn;当Y1Y2Yn-1都能推导出ε时,则FIRST(Y1)FIRST(Y2)、…、FIRST(Yn-1)的所有非空元素和FIRST(Yn)包含在FIRST(X)中。

:FIRST(X)=(FIRST(Y1){ε})∪(FIRST(Y2){ε})∪…∪(FIRST(Yn-1){ε})∪{FIRST(Yn)}

⑤.(4)中所有Yi能够推导出ε,(i=1,2,n),则

FIRST(X)=(FIRST(Y1){ε})∪(FIRST(Y2){ε}∪…∪(FIRST(Yn){ε})∪{ε}

反复使用上述步直到每个符号的FIRST集合不再增大为止。


3、求解示例

1、文法G[S]为:
  SAB
  SbC
  A→ε
  Ab
  B→ε
BaD
CAD
Cb
DaS
Dc

求每个非终结符的First集?

解:对于非终结符S,S的开始符有终结符b和非终结符A,根据上面定义②把b加入FIRST(S),由上面的定义③FIRST(A)中的所有非空符号串ε元素都加入到FIRST(S)中,而且因为SAB符合上面的定义④和⑤,所以FIRST(S)=(FIRST(A){ε})∪FIRST(B){ε})∪{ε}那么先求FIRST(A)和FIRST(B),A的开始符有终结符b和空符号串ε,由定义①和定义②全部加入FIRST(A),也就是FIRST(A)={ε,b},同理,FIRST(B)={a,ε},这样FIRST(S)也就求出来了,FIRST(S)={b,a,ε},其实回过头来看之所以要反复调用定义②~⑤,是因为开始符中A可能为空字符串ε,所以要考虑A后面的情况。

再求,FIRST(C),由定义①,把b加入FIRST(C),再由定义④,FIRST(C)=(FIRST(A){ε})∪{FIRST(D)},先求FIRST(D),易知,FIRST(D)={a,c},所以FIRST(C)={b,a,c}


4、小结

1、对于终结符而言,FIRST集中的元素只有它本身

2、对于非终结符而言,如果开始符是终结符或者空符号串ε,则加入其FIRST集中;若开始符是非终结符,则要加入它的不含ε的FIRST集,并考虑其为ε时的情况。



二、FOLLOW集

FOLLOW(A)={a|S能推导出μAβ,且a∈VT,a∈FIRST(β),μ∈VT* ,β∈V+},若S能推导出μAβ,且β能推导出ε, 则#∈FOLLOW(A)。 也可定义为:FOLLOW(A)={a|S能推导出…Aa…,a ∈VT} ,若有S能推导出…A,则规定#∈FOLLOW(A) ,这里我们用‘#’作为输入串的结束符,或称为句子括号,
如: #输入串#。

FOLLOW(A)为非终结符A的后跟符号集合。

1、定义:

设G=(VT,VN,S,P)是上下文无关文法,A∈VN,S是开始符号  

需要注意的是,FOLLOW(A)集是针对非终结符A的,集合中的元素是终结符,是A的全部后跟符号的集合,当A是文法G的开始符(识别符)时,把‘#也加入其中’


2、根据定义求解FOLLOW集对每一文法符号SVN计算FOLLOW(S)):

①.设S为文法中开始符号,把{#}加入FOLLOW(S)中(这里“#” 为句子括号)。

.若A→αBβ是一个产生式,则把FIRST(β)的非空元素加入

FOLLOW(B)中。如果β能够推导出ε则把FOLLOW(A)也加入FOLLOW(B)中。


③.反复使用(b)直到每个非终结符的FOLLOW集不再增大为止。


3、求解示例

1、文法G[E]为:
E → TE'
E' → +TE' |ε
T → FT'
T' → *FT' |ε
F → (E) | i

求每个非终结符的FOLLOW集?

解:先给出它们的FIRST集:(求解方法见上面FIRST集的求解)

FIRST(F)={ (,i }

FIRST(T’)={ *,ε }

FIRST(T) ={ (,i }

FIRST(E’)={ +,ε }

FIRST(E)={ (,i }
FOLLOW集的求解:因为E是文法的识别符所以把#加入FOLLOW(E),又由规则F → (E) | i 得E的后跟符号),所以,FOLLOW(E)={ #,) };
FOLLOW(E’)={ #,) } ∵E → TE’ ∴FOLLOW(E)加入 FOLLOW(E’)
FOLLOW(T)={+,),#} ∵E'→ +TE’ ∴FIRST(E’)-{ε}加入FOLLOW(T);又E’→ε, ∴ FOLLOW(E’)加入FOLLOW(T)
FOLLOW(T’)= FOLLOW(T)= {+,),#} ∵T → FT’ ∴ FOLLOW(T)加入FOLLOW(T’)
FOLLOW(F)={*,+,),#} ∵T → FT’ ∴ FOLLOW(F)=FIRST(T’)-{ε} ;又T’→ε ∴ FOLLOW(T)加入FOLLOW(F)


4、小结

1、FOLLOW集对于非终结符而言,是非终结符的全部后跟符号的集合,如果后跟终结符则加入,如果后跟非终结符,则加入该非终结符的不含空符号串的FIRST集,特别地,文法的识别符的FOLLOW集需要额外的加入‘#’。



三、SELECT集

1、定义:

给定上下文无关文法的产生式A→α, A∈VN,α∈V*, 若α不能推导出ε,则SELECT(A→α)=FIRST(α)   

如果α能推导出ε则:SELECT(A→α)=(FIRST(α) –{ε})∪FOLLOW(A)

需要注意的是,SELECT集是针对产生式而言的。


2、LL(1)文法

① 一个上下文无关文法是LL(1)文法的充分必要条件是:对每个非终结符A的两个不同产生式,A→α, A→β,满足SELECT(A→α)∩SELECT(A→β)=空集 其中α,β不同时能推导出ε。

② LL(1)文法的含义:
第一个L 从左到右扫描输入串
第二个L 生成的是最左推导
1 向右看一个输入符号便可决定选择哪个产生式。

③LL(1)文法的判别:当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法。因而我们对任给文法需计算FIRST、FOLLOW、SELECT集合,进而判别文法是否为LL(1)文法。


3、求解示例

1、文法G[S]为:
  SAB
  SbC
  A→ε
  Ab
  B→ε
BaD
CAD
Cb
DaS
Dc

求每个产生式的SELECT集,并判断文法G是否为LL(1)文法?

解:SELECT(S→AB)=(FIRST(AB)-{ε})∪FOLLOW(S)={b,a,#}   

SELECT(S→bC)=FIRST(bC)={b}   

SELECT(A→ε)=(FIRST(ε) -{ε})∪FOLLOW(A)={a,c,#}   

SELECT(A→b)=FIRST(b)={b}   

SELECT(B→ε)=(FIRST(ε) -{ε})∪FOLLOW(B)={#}   

SELECT(B→aD)=FIRST(aD)={a}   

SELECT(C→AD)=FIRST(AD)={a,b,c}   

SELECT(C→b)=FIRST(b)={b}   

SELECT(D→aS)=FIRST(aS)={a}   

SELECT(D→c)=FIRST(c)={c}


由以上计算结果可得相同左部产生式的SELECT交集为:   

SELECT(S→AB)∩SELECT(S→bC)={b,a,#}∩{b}={b}≠ф   

SELECT(A→ε)∩SELECT(A→b)={a,c,#}∩{b}=ф   

SELECT(B→ε)∩SELECT(B→aD)={#}∩{a}=ф   

SELECT(C→AD)∩SELECT(C→b)={b,a,c}∩{b}={b}≠ф   

SELECT(D→aS)∩SELECT(D→c)={a}∩{c}=ф   
由LL(1)文法定义知该文法不是LL(1)文法,因为具有相同左部其产生式的SELECT集的交集不为空。


4、小结

1、Select集的作用是将first集和follow集进行合并,如果两个文法的左端都是A,若他们的select集交集为空,表明他们是两个无关的,不会产生不确定性的文法,反之,则表明文法不是LL(1)文法。


FIRSTFOLLOW白话版 FIRST 可以理解为当前非终结符可以出现的开始符号(终结符)的 求解方法: 步骤: 1.若X->a…,则将终结符a加入FIRST(X)中; 2.若X->e ,则将终结符e加入FIRST(X)中(e表示空); 3.若 X->BCD…E,则将First(B)所有元素(除了空)加入 First(X),然后检测First(B),若First(B)中不存在空, 即e,则停止,若存在则向B的后面查看,将First(C)中所有元素(除了空)加入First(X),然后再检测First(C)中 阅读详情

相关推荐

FIRST

FIRST 1.什么是FIRST? 一个符号的FIRST表示这个符号可以推导出的句子的首符号的合。 举个例子:A→aa|bb|cc。a,b,c是终结符,则FIRST(A)={a,b,c} 通过上面的定义解释一下,符号A可以推导出三个句子{aa,bb,cc},那么,这三个句子的首符号FIRST(A)={a,b,c}。 2.FIRST求法 再给出最终结论之前,首先看以下的几种情况 求一个...

qq2071114140的博客 1万+

编译原理 —— FOLLOW

FOLLOW FOLLOW(A):紧跟在非终结符A后边的终结符α的合 如果A是某个句型的的最右符号,则将结束符 $$$ 添加到 FOLLOW(A)中 计算非终结符A的 FOLLOW合 (1)将$$$放入 FOLLOW(S)中,其中S是开始符号,$$$是输入右端的结束标记 (2)如果存在一个产生式 A→αBβA→αBβA→αBβ ,那么FIRST(B)中除 εεε 之外的所有符号都在FOL...

starter_____的博客 1万+

怎么写解题步骤——FIRSTFOLLOW、LL(1)分析法【编译原理之语法分析】

关键字:编译原理、语法分析、LL(1)分析法、LL(1)分析表、FIRSTFOLLOW、LL(1)例题的详细求解。

Wang_Dou_Dou_的博客 5897

FIRST FOLLOWSELECT

这里注意一点在求FIRST合时很多时候会忘了ε,如果推导不出来那就没关系但是如果可以推导出来的话一定要写上。开始符号FIRST 后跟符号FOLLOW 选择SELECT合这个是最复杂的也是最难的。

m0_53345417的博客 1217

编译原理之--FIRSTFOLLOW SELECT

FIRSTFOLLOW SELECT 一、FIRST FIRST(A)为A的开始符或者首符号。 1、定义: 设G=(VT,VN,S,P)是上下文无关文法 ,FIRST(α)={a|α能推导出aβ,a∈VT,α,β∈V*}    特别的,若α能推导出ε,则规定ε∈FIRST(α). 2、根据定义求解FIRST(对每一文法符号X∈V 计算F

小菜鸟的博客 5万+

离散数学——FIRSTFOLLOWSELECT的通俗求法

离散数学——FIRSTFOLLOWSELECT的通俗求法 FIRST合 添加终结符以及空字 若X∈ε,则ε∈FIRST(X) 若X=a…,若a∈VT,则a∈FIRST(X); 添加非终结符——后加前,first 若有表达式α->X1X2…Xn,Xi为非终结符 <1>将FIRST(X1)中的一切非ε的终结符加进FIRST(α); <2>若ε∈FIRST(X1),则将FIRST(X2)中的一切非ε的终结符加进FIRST(α); <3>若ε∈FIRS

Blackoutdragon的博客 2944

编译原理-自顶向下语法分析之求FirstFollowSelect

设G=(VT,VN,S,P)是上下文无关文法,FIRSTα()={a|α⇒aβ,a∈VT,α , β∈V*}若α⇒ε,则规定ε∈FRIST(α)

2301_77207297的博客 1363

如何求LL(1)文法的 FIRSTFOLLOW SELECT

FIRSTFOLLOW SELECT一、FIRSTFIRST(A)为A的开始符或者首符号。1、定义:设G=(VT,VN,S,P)是上下文无关文法 ,FIRST(α)={a|α能推导出aβ,a∈VT,α,β∈V*}   特别的,若α能推导出ε,则规定ε∈FIRST(α).2、根据定义求解FIRST(对每一文法符号X∈V 计算FIRST(X)):①. 若X∈VT,则FIRST(X)=...

k_lawliet的博客 4255

FIRSTFOLLOWSELECT

*一:什么是终结符非终结符。* 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导。 非终结符:不是终结符的都是非终结符。 如:S——>B,则S是非终结符。 (一般书上终结符用小写,非终结符用大写。) 二:文法产生语言句子的基本思想:从识别符号(开始符)开始,把当前产生的符号串中的非终结符替换为相应规则右部的符号串,直到全部由终结符组成。 三:什么是FIRST FIRST的定义: 如果α是任意的文法符号串,则我们定义FIRST(α)是从α推导出的串的开始符号的终结符

qq_41870170的博客 3598

编译原理LL(1)文法的判断(firstfollowselect

编译原理LL(1)文法的判断(firstfollowselect) 1、问 如何通过给定的文法,判断该文法是否是LL(1)文法? 2、答 求出该文法的firstfollowselect,通过select之间的关系进行判断 3、合 3.1 first B->abS first(B)={a} B->AS 若A(A可0步或多步得出A->ε),fi...

一只睡不醒的猪 8048

编译原理求FIRSTFOLLOWSELECT

转自:https://liuyanzhao.com/8279.html 觉得解释比较不错。 所有大写字母代表非终结符,小写字母代表终结符,省略号代表未知数目(可能为0)的不确定类型的文法符号。 First合: First合顾名思义就是求一个文法符号串所可能推导出的符号串的第一个终结符的合。 First(X)就是求X所有推导出的符号串的第一个符号的合。 求First合可分如下几...

清风徐来的博客 3万+

LL(1)文法与其对应的FOLLOW,SELECTFIRST

所谓LL1(1)文法是一种预测分析文法。 从文法的开始符号出发,从每一步推导过程中根据当前句型的最左非终结符A当前输入符号a能够就能够确定出一个产生式。这样就是预测分析文法的工作过程。仔细想这个过程,假设有S -> aBC S->aDE两个产生式,当输入指针指向a的时候,发现两个产生式都是合适的,那么我们应该选择那个产生式呢?这就是预测分析文法会面临的问题,这个就涉及到我们所说...

hanzhen7541的博客 2931

如何求FIRSTFOLLOWSELECT---方法例题讲解

注:α、β表示符号串 如何求FIRST (一)求符号的FISRST 对于文法G中的任意一个符号X(X属于终结符号非终结符号),其FISRST(x)的产生如下: (1),若X属于终结(VT),则FIRST(X)={X} (2),若X属于非终结符号(VN),且有形如X->a的产生式(a属于非终结符号)或者形如X->ε, 则将a或者ε加入FIRST(X)中 (3),如果文法中有如下的产生式 X->Y1Y2....Yk ① 若Y1属于非终结符号,则把FIRST(Y1)中的

dfency的博客 1312

FIRSTFOLLOWSELECT(期末笔记人话版)

期末复习用,编译原理 个人笔记 记录自己不太懂的玩意

site73的博客 711
上一篇: Struts2数据类型转换
下一篇: FIRST集、FOLLOW集 和 SELECT集
DR达仁
博客等级 码龄14年 29粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值