FIRST集和FOLLOW集,FIRSTVT集和LASTVT集總結
FIRST集和FOLLOW集,FIRSTVT集和LASTVT集總結
轉載自:http://dongtq2010.blog.163.com/blog/static/1750224812011520113332714/
學編譯原理的時候,印象最深的莫過於這四個集合了,而且也十分為之糾結。
首先要知道First和Follow是一對,而Firstvt和Lastvt是一對。
然後要知道這兩對都是幹什麼的。
First和Follow是為了畫預測分析表的(在LL(1)分析法處)。
而Firstvt和Lastvt是為了畫算符優先關係表的(就是表裡面填優先大於小於等於的那個)。
然後要注意他們可都是終結符的集合。
再就是他們如何構建的問題了
先說First和Follow
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是不同的。
再說下Firstvt和Lastvt
Firstvt
找Firstvt的三條規則:如果要找A的Firstvt,A的候選式中出現:
A->a…….,即以終結符開頭,該終結符入Firstvt
A->B…….,即以非終結符開頭,該非終結符的Firstvt入A的Firstvt
A->Ba…..,即先以非終結符開頭,緊跟終結符,則終結符入Firstvt
Lastvt
找Lastvt的三條規則:如果要找A的Lastvt,A的候選式中出現:
A->…….a,即以終結符結尾,該終結符入Lastvt
A->…….B,即以非終結符結尾,該非終結符的Lastvt入A的Lastvt
A->…..aB,即先以非終結符結尾,前面是終結符,則終結符入Firstvt
(大佬總結的太好了!!!)