First集和Follow集(轉(zhuǎn))

FIRST集合和FOLLOW集合
一、First集合
定義:
First集合是對產(chǎn)生式右部的字符串而言的,求取的是非終結(jié)符VT(或終結(jié)符、空字符、文法符號串)的開始符號集合,集合中包含的是由左部非終結(jié)符VT推導(dǎo)得到的終結(jié)符VN或空字符ε。以α表示一個文法的字符串,F(xiàn)IRST( α )表示由α推導(dǎo)出的串的首個終結(jié)符或空字符組成的集合。

規(guī)則
求文法符號X的FIRST( X ) ,直到?jīng)]有終結(jié)符或空字符可以加入。
① 如果X屬于終結(jié)符VT,則FIRST(X) = { X } 。
② 如果X屬于非終結(jié)符VN,且有產(chǎn)生式形如X → a…,則FIRST( X ) = { a }。
③ 如果X屬于非終結(jié)符VN,且有產(chǎn)生式形如X → ABCdEF…(A、B、C均屬于非終結(jié)符且包含 ε,d為終結(jié)符),需要把d、FIRST( A )、FIRST( B )、FIRST( C )加入到FIRST( X)中。
④ 如果X經(jīng)過一步或多步推導(dǎo)出空字符ε,將ε加入FIRST( X )。

一組文法符號串
由規(guī)則可知單個文法字符的FIRST集,那么一組文法字符串的FIRST集也可以求取了。假設(shè)文法符號串S由X1X2X3……Xn組成,則將每個文法符號Xi的FIRST集加入到FIRST( S )中,包括空字符ε。

舉例1
設(shè)有文法G[A]:?
???A→BCc?|?gDB??????
???B→bCDE?| ε?????
???C→DaB?|?ca??????
???D→dD?| ε??????
???E→gAf?|?c?
解:
FIRST( A ) = FIRST( BCc ) ∪ FIRST( gDB )
=FIRST( B )∪FIRST( C )∪{ c }∪{ g }
由規(guī)則③規(guī)則②可知
FIRST( A ) =FIRST( B )∪FIRST( D )∪{ a }∪{ c }∪{ c }∪{ g }
={ b,ε?}∪{ d,ε }∪{ a }∪{ c }∪{ g }
={ a,b,c,d,g ,ε }
FIRST( B ) = { b,ε }
FIRST( C ) = FIRST( D )∪{ a }∪{ c }= { a,c,d,ε }
FIRST( D ) = { d,ε }
FIRST( E ) = { g,c }
對于A來說:有兩種選擇 BCc 與 gDB,BCc用規(guī)則③,gDB用規(guī)則②。
對于B來說:有兩種選擇 bCDE 與 ε,均用規(guī)則②。
對于C來說:有兩種選擇 DaB 與 ca,由于D存在空字符,所以 DaB用規(guī)則③,ca用規(guī)則②。
對于D來說:有兩種選擇dD?與 ε?,分別用規(guī)則②與規(guī)則④。
對于E來說:有兩種選擇gAf?與?c?,均用規(guī)則②。

舉例2
設(shè)有文法G[S]:
???S→aBS | bAS | ε
???A→bAA | a
???B→aBB | b
解:
FIRST( S ) = FIRST( aBS )∪FIRST( bAS )∪{ ε }={ a,b,ε }
FIRST( A ) = { a,b }
FIRST( B ) = { a,b }
對于S來說:有三種選擇 aBS與bAS、ε,分別用②與規(guī)則④。
對于A來說:有兩種選擇bAA與 a,均用規(guī)則②。
對于B來說:有兩種選擇aBB與 b,均用規(guī)則②。

二、Follow集合
定義:
Follow集合是對某個非終結(jié)符而言的,求取的是非終結(jié)符VT的后繼符號集合,集合中包含的是由非終結(jié)符VT后面緊跟的終結(jié)符VN和結(jié)束符$,不能出現(xiàn)空字符ε 。以X表示一個非終結(jié)符,F(xiàn)OLLOW( X )表示當(dāng)X通過規(guī)約出現(xiàn)時,接下來的輸入可能是哪些終結(jié)符。

規(guī)則
求非終結(jié)符X的FOLLOW( X ) ,直到?jīng)]有終結(jié)符可以加入。
① 如果X是開始符號,則將$加入到FOLLOW(X)中 。
② 如果存在一個產(chǎn)生式S->αXβ,那么將集合FIRST(β)中除ε外的所有元素加入到FOLLOW(X)當(dāng)中。
③如果存在一個產(chǎn)生式 S->αX , 或者S->αXβ且FIRST(β)中包含ε , 那么將集合FOLLOW(S)中的所有元素加入到集合FOLLOW(X)中。

舉例1
設(shè)有文法G[A]:?
???A→BCc?|?gDB??????
???B→bCDE?| ε?????
???C→DaB?|?ca??????
???D→dD?| ε??????
???E→gAf?|?c?
解:
FOLLOW( A ) ={ f ,} FOLLOW( B ) = FIRST( C )∪FOLLOW( A )∪FOLLOW( C ) ?????????????={ a,c,d }∪{ f , }∪{ c,d,g,} ?????????????={ a,c,d,f,g, }
FOLLOW( C ) = { c }∪FIRST( D )∪FIRST( E )
???????????? ={ c }∪{ d }∪{ g,c }
???????????? ={ c,d,g }
FOLLOW( D ) = FIRST( B )∪FOLLOW(A )∪FIRST( E )∪{ a }
?????????????={ b } ∪{ g,c }∪{ f ,}∪{ a } ?????????????={ a,b,c,g,f, }
FOLLOW( E ) = FOLLOW( B )
?????????????={ a,c,d,f,g,} 其中,A,B,C,D,E都是非終結(jié)符,A是開始符號。 對于A的出現(xiàn)來說:A是開始符號,規(guī)則①需要加入;E→gAf,規(guī)則②將f加入FOLLOW( A )。
對于B的出現(xiàn)來說:有?A→BCc,規(guī)則②將FIRST( C )除ε以外加入進(jìn)去;有A→gDB,規(guī)則③將FOLLOW( A )加入進(jìn)去;有C→DaB,規(guī)則③將FOLLOW( C )加入進(jìn)去。
對于C的出現(xiàn)來說:有?A→BCc,規(guī)則②將c加入進(jìn)去;有B→bCDE,規(guī)則③將FOLLOW( D )加入進(jìn)去,由于D存在空字符ε,所以需要把FIRST( E )除ε以外也加入進(jìn)去。
對于D的出現(xiàn)來說:有A→gDB,規(guī)則②將FIRST( B )除ε以外加入進(jìn)去,由于B存在空字符ε,所以規(guī)則③將FOLLOW( A )加入進(jìn)去;有B→bCDE,規(guī)則②將FIRST( E )除ε以外加入進(jìn)去;有C→DaB,規(guī)則②將a加入進(jìn)去。
對于E的出現(xiàn)來說:有B→bCDE,規(guī)則③將FOLLOW( B )加入進(jìn)去。

舉例2
設(shè)有文法G[S]:
???S→aBS | bAS | ε
???A→bAA | a
???B→aBB | b
解:
FOLLOW( S ) = { } FOLLOW( A ) = FIRST( S )∪FOLLOW( S )∪FIRST( A ) ?????????????={ a,b } ∪{ }∪{ a,b }
?????????????={ a,b,} FOLLOW( B ) =FIRST( S )∪ FOLLOW( S )∪FIRST( B ) ?????????????={ a,b } ∪ { }∪{ a,b }
?????????????={ a,b,} 其中S,A,B是非終結(jié)符,S是開始符號。 對于S的出現(xiàn)來說:規(guī)則①將加入進(jìn)去。
對于A的出現(xiàn)來說:有S→bAS,規(guī)則②將FIRST( S )除ε以外加入進(jìn)去,由于S存在空字符ε,規(guī)則③將FOLLOW( S )加入進(jìn)去;有A→bAA,規(guī)則②將FIRST( A )除ε以外加入進(jìn)去。
對于B的出現(xiàn)來說:有S→aBS,規(guī)則②將FIRST( S )除ε以外加入進(jìn)去,由于S存在空字符ε,規(guī)則③將FOLLOW( S )加入進(jìn)去;有B→aBB,規(guī)則②將FIRST( B )除ε以外加入進(jìn)去。

第三部分·如何構(gòu)造LL(1)分析表
首先畫出表格,表格的左列是每一個產(chǎn)生式的左部(不重復(fù)),表格的橫行是每一個終結(jié)符號。
接著逐個考察所有產(chǎn)生式。
抽象算法:
對于G中的每一個產(chǎn)生式, A -> α ,執(zhí)行以下2步:

1.for ? a ∈ FIRST(α), 將 A -> α 填入 M [A, a ];

//對逐個產(chǎn)生式進(jìn)行考察,考察產(chǎn)生式的FIRST集合的元素,在找到的元素的對應(yīng)表格中填寫該產(chǎn)生式

  1. if(ε ∈ FIRST(α))

      ? a ∈ FOLLOW (A) , 將 A -> ε 填入 M [A, a ];
    

//如果發(fā)現(xiàn)產(chǎn)生式的FIRST集中包含空符號,就查找該產(chǎn)生式頭部的FOLLOW集合中的元素,在元素的對應(yīng)表格中填寫空產(chǎn)生式


原文:https://blog.csdn.net/Cielyic/article/details/82941014

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,583評論 0 13
  • 純屬瞎寫借鑒,我覺得很好懂,給那些不懂的人看 計(jì)算FIRST集:① 根據(jù)定義計(jì)算:對每一文法符號X∈V 計(jì)算FIR...
    何處皆不見過往閱讀 11,932評論 2 4
  • 文法: S→ABc A→a|ε B→b|ε First集合求法: 能由非終結(jié)符號推出的所有的開頭符號或可能的ε,但...
    暖熊熊閱讀 9,854評論 2 9
  • 求解first集與follow集通過作業(yè)題目例子來體會。 題目 1. First 集 First(A)為A的開始符...
    海de我閱讀 22,855評論 1 4
  • 我的人生沉重而又憂傷地遇到了文學(xué),于是我決定報考那門冷清而又看似前途渺茫的專業(yè),結(jié)果果然遭到了家人的一致反對。于是...
    易容風(fēng)閱讀 345評論 1 2

友情鏈接更多精彩內(nèi)容