1. 程式人生 > >文法分析小結:自底向上的分析方法和自頂向下的分析方法有哪些

文法分析小結:自底向上的分析方法和自頂向下的分析方法有哪些

首先注意一點:無論是那種語法分析,語法都是從左至右的讀入符號!

自底向上分析法,也稱移進-歸約分析法。

它的實現思想是對輸入符號串自左向右進行掃描,並將輸入符逐個移入一個後進先出棧中,邊移入邊分析,一旦棧頂符號串形成某個句型的控制代碼時,(該控制代碼對應某產生式的右部),就用該產生式的左部非終結符代替相應右部的文法符號串,這稱為一步歸約。重複這一過程直到歸約到棧中只剩文法的開始符號時則為分析成功,也就確認輸入串是文法的句子。

總結了一下子,方便做題的時候查一下,省的總是翻書找半天,而且書上也沒有很明確的總結和說明。

自底向上的分析技術 有:
( 1 )簡單優先分析法
( 2 )算符優先分析法
( 3 )優先函式
( 4 ) LR 分析法

確定的自頂向下分析方法

是從某文法的開始符號出發,考慮如何根據當前的輸入符號(單詞符號)唯一地確定選用哪個產生式替換相應非終結符往下推導,或如何構造一棵相應的語法樹,其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號串為該文法的句子。

自頂向下的分析技術 有:
( 1 )LL(1)分析法
( 2 )遞迴下降分析法

其中如何判斷是LL(1)文法:

我們可以用 LL(1) 法來解析的語法被稱為 LL(1) 語法( LL(1) grammar ),當且僅當一種語法具有以下特性時,此語法才是 LL(1) 語法:

對該語法中的任何非終結符 A ,若其所有產生式為: A -> u1 | u2 | ... | un ,則:

(1) First(u1), First(u2), ... First(un) 互不相交;

(2) 若有一個 First(ui) 中含 ε ,則 Follow(A), First(u1), First(u2), ... First(un) 互不相交。

判別一種語法是否是 LL(1) 語法的方法就是構造其分析表,若構造過程中沒有發現衝突,也就是表中的任何元素 M[X, a] 最多隻有一個動作,那麼此語法就是 LL(1) 語法。

遞迴下降分析法用的比較少,在自底向上的分析法中,我們用的比較多的是LR分析法,構建LR分析表都是編譯原理的重點。

嗯,先總結到這。