First集Follow集通俗易懂的講解加例項

2021-06-28 04:54:13 字數 1409 閱讀 3037



文法:

s→abc

a→a|ε

b→b|ε

first集合求法:

能由非終結符號推出的所有的開頭符號或可能的ε,但要求這個開頭符號是終結符號。如此題a可以推導出a和ε,所以first(a)={a,ε};同理 first(b)=;s可以推導出abc,還可以推導出bc,還可以推導出c,所以first(s)={a,b,c}

follow集合的求法:

緊跟隨其後面的終結符號或#。但文法的識別符號包含#,在求的時候還要考慮到ε。 具體做法是把所有包含你要求的符號的產生式都找出來,再看哪個有用。 follow(s)={#}

如求a的follow集產生式:s→abc a→a|ε ,但只有s→abc 有用。跟隨在a後年的終結符號是first(b)={b,ε},當first(b)的元素為ε時,跟隨在a後的符號就是c,所以 follow(a)={b,c} 同理follow(b)={c}

上述如果沒看懂的話,下面的講解也可以作為參考

first

如a->ab | cd

這裡面包含了組成first(a)的兩種情況:

以終結符開頭,    當然要把這個終結符放到a的first裡

以非終結符開頭, 先把c的first放到a的first裡

再看如果c的first中有空的話就把d的first放到a的first裡,如果d也有空的話往後依次類推

技巧:first一般從下往上找。

如果要找a的first,我們要找a的定義式,即a在左邊的式子,看著他的右邊來找。

follow

如s->(l) | al | lc   

找follow的三種情況:先在候選式(右邊)中找到該非終結符,如l(注意例中只有乙個定義,但找follow要看到所有右邊出現該非終結符的)

如果l的右邊是終結符,    那麼這個終結符加入l的follow

如果l的右邊是非終結符, 那麼把這個非終結符的first除去空加到l的follow中

如果l處在末尾,               那麼,'->'左邊符號的follow成為l的follow

另外要注意的是:

開始符號的follow中要加上『#』        

技巧:follow一般從上往下找。

如果要找l的follow,要從式子的右邊找到l,然後來找l的follow,這與first是不同的。



怎麼求 first集 follow集

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

FIRST集 FOLLOW集 和 SELECT集

first a 為a的開始符或者首符號集。設g vt,vn,s,p 是上下文無關文法 first 特別的,若 能推導出 則規定 first 若x vt,則first x 簡單講,終結符的first集就是它本身 若x vn,且有產生式x a a vt,則 a first x x 則 first x 簡...

C 實現first集follow集

1.代替字元 2.同一非終結符如有多條產生式必須寫成一行,中間用 分隔,不允許有空格 存在很多問題,大量 非正常 情況都未考慮,謹慎參考 include include include includeusing namespace std struct exp vectorv 產生式集合 strin...