語法分析(自頂向下/自底向上)
自頂向下
- 遞歸下降分析法
這種帶回溯的自頂向下的分析方法實際上是一種窮舉的不斷試探的過程,分析效率極低,在實際的編譯程序中極少使用。
- LL(1)分析法
又稱預測分析法,是一種不帶回溯的非遞歸自頂向下分析方法。(使用顯式棧)
LL(1)的含義是:第一個L表明自頂向下分析是從左向右掃描輸入串,第2個L表明分析過程中將使用最左推導,1表明只需向右看一個符號便可決定如何推導,即選擇哪個產生式(規則)進行推導。
需要解決的幾個問題
1.怎么根據某個文法構造LL(1)分析表First集
【注:first集需要注意的是----產生式右部是以非終結符開始 而且這個非終結符會推出ε,那么first集就得加入下一個的first集】
Follow集
【注:follow集需要注意的是----這種類型的產生式A->αBβ且β->ε的形式 與A->αB同樣看待】
2.怎么判斷一個上下文無關文法是不是LL(1)文法
自底向上
- 算符優先分析法(OPG)
它只考慮算符(終結符)之間的優先關系,分析掃描每個規約式的算符間優先關系。算符文法:即它的任一產生式的右部都不含兩個相繼的非終結符的文法。如果G是一個不含空字符的算法文法,那么只要它的任一對終結符都至多只滿足>,=,<的關系的其中一種,則稱g是一個算符優先文法。
假定G是一個不含空字符產生式的算符文法。對於任何一對終結符a,b,
(1)a=b,當且僅當G中含有形如P->…ab…或P->…aQb…的產生式;
(2)a<b, 當且僅當G中含有形如P->…aR…的產生式,而R-〉b…或R->Qb…;(3)a>b, 當且僅當G中含有形如P->…Rb…的產生式,而R->…a或R->…aQ;【注:a<b不等價於b>a! 這里的等號左右順序指明的是式子中這兩個終結符的左右順序。
實際上,這里的大小關系就是先后規約的優先級關系】
需要解決的幾個問題
- 構造Firstvt以及Lastvt集
- 接着便是構造優先關系表
給幾個語法分析的例題![]()
再看一個例子,判斷某個上下文無關文法是否是LL(1)分析文法(或者將某個文法改造成LL(1)分析文法[其實,是先將這個文法消除左遞歸、回溯,這是LL(1)分析文法的基本條件,再應用充要條件判斷是否是LL(1)分析文法])
算符優先分析法的例子
![]()
![]()
![]()
![]()
再看看下面這個例子(經過這些例題的理解,其實就是這兩種語法分析就是在於 first/follow集 以及 firstvt/lastvt集的運算 再加上一點各自方法)
【附:一文一圖】
