現代編譯原理——第二章:語法分析之LL(K)
阿新 • • 發佈:2018-12-02
轉自: http://www.cnblogs.com/BlackWalnut/p/4472122.html
LL(K)語法分析技術是建立在預測分析的技術之上的。我們先來了解預測分析技術。考慮以下文法:
當使用該文法對(1*2-3)+4和(1*2-3)進行分析,前者因該呼叫E->E+T,而後者應該呼叫E->T,怎麼確定到底使用哪個產生式呢?這就要使用預測分析技術來構建預測分析語法分析器,LL(k)是其一種。預測分析技術的關鍵是構建一個無衝突的預測分析表。所謂預測分析表就是程式可以根據當前的狀態來查詢該表,然後確定下一步使用哪個產生式。
構建預測分析表要要用到兩個集合,分別是first集合和follow集合。γ是終結符和非終結符組成的字串,first(γ)是從γ中可以推到出的任意字串中所包含的開頭終結符所組成的集合。A是一個非終結符,follow(A)的意思可以直接跟在A後面的所有終結符的集合。這兩個集合的求法可以描述為如下:
First集合的求法:
First集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的First集合,由於終結符的First集合就是它自己,所以求出非終結符的First集合後,就可很直觀地得到每個字串的First集合。
1. 直接收取:對形如U-a…的產生式(其中a是終結符),把a收入到First(U)中2. 反覆傳送:對形入U-P…的產生式(其中P是非終結符),應把First(P)中的全部內容傳送到First(U)中。 Follow集合的求法:
Follow集合是針對非終結符而言的,Follow(U)所表達的是句型中非終結符U所有可能的後隨終結符號的集合,特別地,“#”是識別符號的後隨符。 1.反覆傳送:對形如U-…P的產生式(其中P是非終結符),應把Follow(U)中的全部內容傳送到Follow(P)中
需要注意的是,空是隻能在First集合中不能在follow集合中。 從上面的求法中可以知道,其實first集合就是一個非終結符的等價終結符的可選集合,也就是說A可以直接推到出這些終結符,如果first集合可以為空,則說明A可以直接忽略,這個時候,為了預測A為空後的情形,我們構建了follow集合。可見,者兩個完全是為了預測分析而產生的集合。 預測分析表是一個二維表,用非終結符符標註每行,用終結符好標註每一列,根據這first和follow兩個集合,我們使用如下規則構建一個預測分析表:從產生式集合中取出一個產生式A->γ,如果終結符a在first(γ)中,則講A->γ放入(A,a)確定的位置中,如果γ可以為空且a在follow(A)中,也則講A->γ放入(A,a)確定的位置中。這樣我們根據文法以下文法得到其相應的預測分析表: