一:什麼是左遞迴
在電腦科學裡面,左遞迴是一種遞迴的特殊狀況。在上下文無關文法內裡的說法,若乙個非終端符號(non-terminal)r有任何直接的文法規則或者通過多個文法規則,
推導出的句型(sentential form)其中最左邊的符號又會出現r,則我們說這個非終端符號r是左遞迴的。
即形如:r->rj像這樣的式子。
二:左遞迴的型別1:直接左遞迴:經過一次推導就能看出文法存在左遞迴的產生式
形如:s->sb|ε
2:間接左遞迴:
經過多次推導才能看出文法存在左遞迴的產生式
形如:s->asb|ε
a->aa|ε
當a->ε時,第乙個產生式就是直接左遞迴了。
三:左遞迴的解法直接左遞迴的解法:
1、把所有產生式寫成候選式形式。如a→aa1|aa2……|aan|b1|b2……|bm。其中每個a都不等於ε,而每個b都不以a開頭。
2、變換候選式成如下形式:
a→b1a』|b2a』……|bma』
a』 →a1a』|a2a』……|ana』|ε
例子:考慮文法g: s->sb,|a一次推導: s->sb,
兩次推導: s->sb,b,
三次推導: s->sb,b,b,
....
n次推導: s->ab,b,b,b,.....
觀察上面的推導式子,該產生式子最後產生的字串是以a開頭的字串。
所以 s->sb,|a可以替換為
s->as'
s'->b,s'|ε
間接左遞迴的解法:
將間接轉換為直接。
要求:文法不存在環和ε產生式步湊:
1、以某種順序排列非終結符a1,a2,……,an;
2、for i = 1 to n do
消除關於ai產生式中的直接左遞迴性
} 3、化簡由步驟2所得到的文法。
例子:s->ab|a
a->bc|t
b->sb|l|d
1:非終結符號排序:b,a,s
2: 用b->sb|l|d中的 sb|l|d 代替 a->bc|t中的b得到:
a->sbc|lc|dc|t
用a->sbc|lc|dc|t中的sbc|lc|dc|t 代替 s->ab|a中的a得到:
s->sbcb|lcb|dcb|tb|a
消除直接左遞迴:
s->lcbs'|dcbs'|tbs'|as'
s'->bcbs'|ε
所以最終的結果:
s->lcbs'|dcbs'|tbs'|as'
s'->bcbs'|ε
a->sbc|lc|dc|t
b->sb|l|d
編譯原理(語法分析之消除左遞迴 消除回溯)
引言 語法分析 自上而下分析部分內容 顧名思義,自上而下就是從文法的開始符號出發,向下推導,推出句子。其中,自上而下分析方法不允許文法含有任何左遞迴。為構造不帶回溯的自上而下分析演算法,首先要消除文法的坐遞迴性,並找出克服回溯的充分必要條件。下面討論消除左遞迴和克服回溯。左遞迴的消除 直接消除產生式...
遞迴下降語法分析
看了這篇部落格之後,總算搞明白了以前編譯原理沒搞懂的ll文法的意義。下面用這種方法實現乙個簡單的計算機器程式 其bnf正規化如下 operator operator operator operator expression 0,1,2,3,4,9 expression operator expres...
遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...