『壹』 關於編譯原理first follow 和select
首先要明白這三個集的作用和用途,知道了他們是用來做什麼的之後,理解起來就簡單一些
First(A)集的作用是標示在替換非終結符A的時候,替換後的文法的首字母集合,語法分析程序根據這個來判斷給定的語言是否是合法的,是符合規則的。
Follow(A)的作用是標示那些可以出現在A之後的字元,語法分析程序根據這個,在A可以被替換為e(空)的時候來進行判斷,看當前的文法是否是合法的。
這里簡單說明下,比如A->b,A->e(空) 當給定的語言是 bXXXXX的時候,根據第一句文法就可以判定句子合法,但是如果給的語言是cXXXXX的時候,因為A->可以替換為空,這時候就需要一句A的follow集來進行判斷,若A的follow集裡面含有c 則語言是合法的
Select集的作用是將first集和follow集進行合並,如果兩個文法的左端都是A,若他們的select集交集為空,表明他們是兩個無關的,不會產生不確定性的文法,反之,則表明文法不是LL(1)文法
計算的公式很繁雜,理解了意思之後,看就能看出來。。。。
『貳』 編譯原理中LR(1) 那個向前搜索符怎麼求的 跪求高手解答 復制粘貼或者答非所問的別來
1、首先第一步就是項目[S』-> . S,],自動生成搜索符],自動生成搜索符],自動生成搜索符,從項目[A->α.Bβ,?]生成項目[B->…,first(β)]。
『叄』 關於編譯原理first follow 和select
在編譯原理中,First(A)、Follow(A)和Select集是非常重要的概念。First(A)集的作用在於表示在替換非終結符A時,替換後的文法規則的首字母集合。這對於語法分析程序判斷給定語言是否符合規則至關重要。
Follow(A)集則標識了在非終結符A之後可以出現的字元。這種信息對於分析程序在A可以被替換為空(ε)的情況下,進行合法性的判斷非常關鍵。以一個簡單的例子說明:假設文法規則為A->b, A->ε。當輸入語言為bXXXXX時,根據第一條規則可以判定句子是合法的。但如果輸入語言為cXXXXX時,由於A可以被替換為空,此時就需要藉助A的Follow集來進行判斷。如果A的Follow集中含有字元c,則說明語言是合法的。
Select集的作用是將First集和Follow集進行合並。具體來說,當兩個文法規則的左端都是A時,如果它們的Select集交集為空,則表明這兩個規則是無關的,不會產生不確定性的文法。反之,如果Select集的交集不為空,則表明這些規則可能會導致文法不是LL(1)文法。通過這種合並,可以有效地幫助我們理解文法的結構和規則之間的關系。
雖然計算Select集的具體公式可能較為復雜,但只要理解了這些概念背後的邏輯,就能更容易地理解和應用它們。這種合並過程對於確保文法的確定性和可解析性非常重要。
綜上所述,First(A)、Follow(A)和Select集在編譯原理中扮演著關鍵角色。通過理解和應用這些概念,我們可以更好地分析和優化文法,確保其能夠正確解析輸入語言。這不僅有助於提高編譯器的性能,還能增強對復雜文法規則的理解。
『肆』 編譯原理 FOLLOW集
因為有:
T→ F T』
T』→ *F T』
所以FIRST(T')是FOLLOW(F)的子集。所以 * 是FOLLOW(F)中的元素。
因為有:
T→ F T』
T』→ε
所以FOLLOW(T)是FOLLOW(F)的子集。
因為有:
E』→ +TE』
所以FIRST(E『)是FOLLOW(T)中的子集。所以FIRST(E『)是FOLLOW(F) 中的子集。
因為有:
E』→ +TE』
所以+是FIRST(E』)中的元素,所以+是FOLLOW(F)中的元素。
因為有:
E』→ ε
E → TE』
所以有:
FOLLOW(E)是FOLLOW(T)子集。前面有所以FOLLOW(T)是FOLLOW(F)的子集。所以有
FOLLOW(E)是FOLLOW(F)的子集,
由F → (E)|id
知 ) 是FOLLOW(E)的元素。所以 ) 是FOLLOW (F)的元素。
因為E是開始符號,所以有 $ 是FOLLOW(E)中的元素,所以 $ 是FOLLOW(F)中的元素。
綜上所述:
FOLLOW(F)= {*,+,),$}
『伍』 誰能通俗解釋一下FIRST集和FOLLOW集的求法啊
三,FIRST集求法
First集合最終是對產生式右部的字元串而言的,但其關鍵是求出非終結符的First集合,由於終結符的First集合就是它自己,所以求出非終結符的First集合後,就可很直觀地得到每個字元串的First集合。
1. 直接收取:對形如U->a…的產生式(其中a是終結符),把a收入到First(U)中
2. 反復傳送:對形入U->P…的產生式(其中P是非終結符),應把First(P)中的全部內容傳送到First(U)中【意思就是只需要把第一個非終結符的First集傳過去~這個地方是要注意的地方,也是難點】。
四,FOLLOW集的求法
Follow集合是針對非終結符而言的,Follow(U)所表達的是句型中非終結符U所有可能的後隨終結符號的集合,特別地,「#」是識別符號的後隨符。注意Follow集合是從開始符號S開始推導。
1. 直接收取:注意產生式右部的每一個形如「…Ua…」的組合,把a直接收入到Follow(U)中。因a是緊跟在U後的終結符。
2.直接收取:對形如「…UP…」(P是非終結符)的組合,把First(P)直接收入到Follow(U)中【在這里,如果First(P)中有空字元,那麼就要把左部(假設是S)的Follow(S)送入到Follow(U)中。還有就是Follow集中是沒有空字元的】。
3. 直接收取:若S->…U,即以U結尾,則#∈Follow(U)
4.*反復傳送:對形如U->…P的產生式(其中P是非終結符),應把Follow(U)中的全部內容傳送到Follow(P)中。
『陸』 編譯原理計算first 集和follow集的簡單方法 S->bBS' S'->aAS'|ε A->aB|c B->dB' B'->bB'|ε 求計算過程
first : S'=a,ε
S=b
A=a,c
B=d
B'=b,ε
follow: S'=#
S=#
A=a
B=a
B'=a