編譯原理 自頂向下語法分析

2021-10-05 07:16:54 字數 1669 閱讀 3442

對於任何輸入串,從文法開始符號(根節點)出發,自上而下,從左到右地為輸入串建立語法分析樹。簡而言之,就是尋找輸入串的最左推導的過程。

之前我們了解到,一旦有左遞迴存在便無法構建這樣的語法樹,所以用自頂向下語法分析必須先去除左遞迴。同樣,由於使用最左推導,也不能處理有複雜回溯的輸入串。

自頂向下的語法分析的一種。**分析能夠根據當前輸入的符號為非終結符確定採用哪乙個選擇。為此需要為每乙個非終結符寫乙個分析過程,這個過程可能會產生遞迴。

舉乙個例子:

有下列產生式:

type->****** |↑id|array[******]oftype

******->integer|char|num dotdot num

構造遞迴向下的**分析程式要為每乙個非終結符構建乙個函式,使編譯器明確知道如果遇到了這個終結符/非終結符,那麼應該選擇哪乙個產生式。

分析程式:

//輔助的匹配函式

void

match

(terminal t)

if(lookahead==t) lookahead=

nexttoken()

;//傳入的字元是否匹配當前的終結符

else

error()

;}void

type()

else

if(lookahead==

'array'

)else

error()

;}void

******()

else

error()

;}

總得來說,有以下幾點:

lookahead是當前字元,terminal是終結符。引入match函式是判斷是否最後能匹配成功。

為每乙個非終結符以選擇判斷(if-else)的形式判斷應該選哪一種文法繼續。

對一句文法依次匹配,對於終結符,要呼叫match函式進行最後的匹配判斷。對於非終結符要遞迴呼叫自己(直接和簡介)。

這裡討論表驅動的**分析器。將乙個輸入通過非遞迴向下的語法分析得到語法分析結果的過程,需要三個input:輸入、棧、分析表。得到的結果就是輸出。

非遞迴下降的**分析器的分析是根據當前棧頂元素x和輸入元素a來判定下一步匹配。有下面四種情況:

舉例:**分析id*id+id的動作(**分析表指示了當推導進行到某一步之後下一步應該選擇哪一條文法進行匹配,有關**分析表的演算法將在ll文法中提到。)

文法:

**分析表:

流程:

說明:起始棧空。先壓入終結符$,再壓入起始符號e,輸入指標指向id。e為非終結符,查表,m[e,id]得到te』,用e』t替換e(因為是棧,所以是先進後出),棧頂元變成了t。只有當匹配到終結符的時候,才會輸出終結符並且輸入指標後移。

語法分析 自頂向下分析

確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...

語法分析 自頂向下分析

確定的自頂向下分析方法,首先要解決從某文法的開始符號出發,對給定的輸入符號串如何根據當前的輸入符號 單詞符號 唯一地確定選用哪個產生式替換相應非終結符往下推導,或構造一棵相應的語法樹,若能夠推導出給定的輸入符號串,或能構造出語法樹其末端結點以從左向右的順序連線正好為給定的輸入符號串,則所給的輸入符號...

語法分析 自頂向下分析方法

前陣子弄完詞法分析後,這一周開始語法分析的課程。語法分析 在電腦科學和語言學中,語法分析 英語 syntactic analysis,也叫 parsing 是根據某種給定的形式文法對由單詞序列 如英語單詞序列 構成的輸入文字進行分析並確定其語法結構的一種過程。摘自維基百科 其實學習語法分析,並不是一...