學習編譯原理時, 這幾個集合相信大家並不陌生:FIRST、FOLLOW、FIRSTVT、LASTVT。
其中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,即先以非終結符結尾,前面是終結符,則終結符入Lastvt