計算文法符號x的first(x)時,不斷應用下列規則,直到再沒有新的終結符號或者ε可以被加入到first集合中為止:
1)如果x是乙個終結符號,那麼first(x)=x。
2)若x→…右邊第乙個符號是終結符或 ε ,則直接將其加入 first(x)。
3)若x→…右邊第乙個符號是非終結符,則將其 first 集的的非 ε 元素加入 first(x)。
4)若x→…右邊第乙個符號是非終結符而且緊隨其後的是很多個非終結符,這個時候就要注意是否有 ε 。
4.1]若第 i 個非終結符的 first 集有 ε ,則可將第 i+1 個非終結符去除 ε 的 first 集加入 first(x)。
4.2]若所有的非終結符都能夠推導出 ε ,則將 ε 也加入到 first(x)。
現在我們可以按照如下方法計算任何串x1x2x3…xn的first集合。向first(x1x2x3…xn)加入first(x1)中所有的非ε符號。如果ε在first(x1)中,再加入first(x2)中所有的非ε符號;如果ε還在first(x2)中,再加入first(x3)中所有的非ε符號,以此類推。最後,如果ε在所有的first(xi)中,那麼將ε加入到first(x1x2x3…xn)中。
計算非終結符號a的first(a)時,不斷應用下列規則,直到再沒有新的終結符號可以被加入到任意follow集合中為止:
1)將$放到follow(s)中,其中s是開始符號,而 $ 是輸入右端的結束標記。
2)如果存在乙個產生式a→αbβ,那麼first(β)中除了ε之外的所有符號都在follow(b)中。
3)如果存在乙個產生式a→αb,或存在產生式a→αbβ且first(β)包含ε,那麼follow(a)中所有符號都在follow(b)中。
ps:α,β可以為空。
消除左遞迴之後對於文法的每乙個產生式a→α,進行如下處理:
1)對於first(α)中的每個終結符號a,將a→α加入到m【a,a】中。
2)如果ε在first(α)中,那麼對於follow(a)中的每乙個終結符號b,將a→α加入到m【a,b】中。如果ε在first(α)中,且$在follow(a)中,也將a→α加入到m【a, $】中。
在完成上面的操作後,如果m【a,a】中沒有產生式,那麼將m【a,a】設定為error(在表中用空條目表示)。
編譯原理 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 直到沒...