自上而下分析:
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)中。
當構造完這兩個集合,則開始構造文法分析表
對每乙個產生式a->***,執行
(1)對first(a)中的每乙個終結符a,把a->***加入m[a,a]中。
(2)若『空』在first(a)中,把follow(a)的每乙個終結符b(包括$),把a->***加入m[a,b]中。剩下為錯誤條目,空白處理。
編譯原理 FIRST集和FOLLOW集
自己的理解 例子如果x是乙個終結符,則first x x 如果x是乙個非終結符,則x y 1y2y 3 yk x rightarrow y 1y 2y 3 cdots y k x y1 y 2 y3 yk 其中k 1 k ge1 k 1。i k,a firs t yi 且fi rst y1 firs...
編譯原理 First集和Follow集
剛學first集和follow集的時候,如果上課老師沒有講明白或者自己沒聽明白,自己看的時候還真是有點難理解,不過結合著具體的題目可以理解的更快。先看一下兩種集合的求法 first集合的求法 first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first...
編譯原理 FIRST集與FOLLOW集
first集合是對產生式右部的字串而言的,求取的是非終結符vt 或終結符 空字元 文法符號串 的開始符號集合,集合中包含的是由左部非終結符vt推導得到的終結符vn或空字元 以 表示乙個文法的字串,first 表示由 推導出的串的首個終結符或空字元組成的集合。規則 求文法符號x的first x 直到沒...