FIRST集合 FOLLOW集合以及LL 1 文法

2021-09-19 07:18:03 字數 3523 閱讀 7329

定義

可從α推導得到的串的首符號的集合,其中α是任意的文法符號串。

規則計算文法符號 x 的 first(x),不斷運用以下規則直到沒有新終結符號或 ε可以被加入為止 :

(1)如果 x 是乙個終結符號,那麼 first(x) = x。

(2)如果 x 是乙個非終結符號,且 x ->y1 y2 … yk是乙個產生式,其中 k≥1,那麼如果對於某個i,a在 first(y1)、first(y2)… first(yi-1)中,就把a加入到 first(x) 中。

(3)如果 x ->ε是乙個產生式,那麼將ε加入到 first(x)中。

以上是書上的官方規則,不僅讀起來很拗口,理解也很累。

下面看一下精簡版的規則(從別人 @櫻草書 那裡看來的,感覺很棒,這裡引用一下):

(1)如果x是終結符,則first(x) = 。

(2)如果x是非終結符,且有產生式形如x → a…,則first( x ) = 。

(3) 如果x是非終結符,且有產生式形如x → abcdef…(a、b、c均屬於非終結符且包含 ε,d為終結符),需要把first( a )、first( b )、first( c )、first( d )加入到 first( x ) 中。

(4)如果x經過一步或多步推導出空字元ε,將ε加入first( x )。

實踐記得,曾經有人說過:

唯讀,就會白給

下面以這個文法為例講解一波,會用精簡版規則,更容易理解一些:

e -> t e'

e' -> + t e' | ε

t -> f t'

t' -> * f t' | ε

f -> ( e ) | id

first(e) = first(t) 根據規則3,很容易理解,這裡要注意的由於t不含ε,所以遍歷到t就停止了,e』不會加入進來

first(e』) = first(+) ∪ first(ε)= 根據規則2和4,,很好理解

first(t) = first(f) 根據規則3,和第一條推導過程一樣

first(t』) = first() ∪ first(ε)= 根據規則2和4,和第二條推導一樣

first(f) = first( ( ) ∪ first(id)= 根據規則2

結果:

first(e) = first(t) = first(f) = 

first(e') = first(+) ∪ first(ε)=

first(e') = first(*) ∪ first(ε)=

定義

對於非終結符號a,follow(a) 被定義為可能在某些句型中緊跟在a右邊的終結符號集合。

規則計算文法符號 x 的 follow(x) ,不斷運用以下規則直到沒有新終結符號可以被加入任意follow集合為止 :

(1)將$加入到follow(x)中,其中s是開始符號,而$是輸出右端的結束標記。

(2)如果存在乙個產生式s->αxβ,那麼將集合first(β)中除ε外的所有元素加入到follow(x)當中。

(3)如果存在乙個產生式 s->αx , 或者s->αxβ且first(β)中包含ε , 那麼將集合follow(s)中的所有元素加入到集合follow(x)中。

實踐還是用之前的例子來做

e -> t e'

e' -> + t e' | ε

t -> f t'

t' -> * f t' | ε

f -> ( e ) | id

follow(e) ,根據規則1,首先把$加入進來,根據規則2,可以得出 follow(e) =

follow(e』) = follow(e) = 根據規則3

follow(t) = first(e』) ∪ follow(e) = 根據規則2

follow(t』) = follow(t) = 根據規則3

follow(f) = follow(t) ∪ first(t』) = 根據規則2和3

結果:

follow(e) = follow(e') = 

follow(t) = follow(t') =

follow(f) =

解釋

ll(1) 中第乙個「l」表示從左向右掃瞄輸入,第二個「l」表示產生最左推導,而「1」表示在每一步中只需要向前看乙個輸入符號來決定語法分析動作。

定義對於文法ll(1)文法g,當且僅當g的任意兩個不同產生式 a -> α | β

(1)不存在終結符號a使得α和β都能推導出以a開頭的串。

(2)α和β中最多只有乙個可以推導出空串。

(3)如果 β=》ε ,那麼α不能推導出任何以follow(a)中某個終結符號開頭的串。

可能很多人看的雲裡霧裡,解釋一下:

(1)和(2)意思是α和β的first集合相交。(3)是指如果first(α)中有 ε,那麼first(β)和follow(a)是不相交的集合,反之一樣。

**分析表的構建

方法:對於文法g的每個產生式 a->α ,進行如下處理

(1)對於first(α)中每個終結符號a,將 a->α 加入到 m[a,a] 中。

(2)如果 ε在first(α)中,那麼對於follow(a)中每個終結符號b,將 a->α 加入到 m[a,b] 中。如果 ε在first(α),且$在follow(a)中,也將 a->α 加入到 m[a,$] 中。

還是以之前的例子示例

e -> t e'

e' -> + t e' | ε

t -> f t'

t' -> * f t' | ε

f -> ( e ) | id

1.先求first和follow集合:

first(e) = first(t) = first(f) = 

first(e') = first(+) ∪ first(ε)=

first(t') = first(*) ∪ first(ε)=

follow(e) = follow(e') =

follow(t) = follow(t') =

follow(f) =

2.然後構建乙個這樣的表

3.然後依次填入非終結符號

4.按照規則1填寫其餘內容

5.按照規則2填寫內容

至此整個構建全部完成

編譯原理 First集合和Follow集合的求法

first集合的求法 first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first集合就是它自己,所以求出非終結符的first集合後,就可很直觀地得到每個字串的first集合。1.直接收取 對形如u a 的產生式 其中a是終結符 把a收入到first ...

編譯原理first集合和follow集合

2011.06.4 文法 s abc a a b b first集合求法 能 由非終結符號推出的所有的開頭符號或可能的 但要求這個開頭符號是終結符號。如此題a可以推導出a和 所以first a a,同理 first b s可以推導出abc,還可以推導出bc,還可以推導出c,所以first s a,b...

編譯原理 First集合和Follow集合的求法

first集合的求法 first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first集合就是它自己,所以求出非終結符的first集合後,就可很直觀地得到每個字串的first集合。1.直接收取 對形如u a 的產生式 其中a是終結符 把a收入到first ...