語法分析之左遞迴消除一

2022-07-31 21:12:14 字數 1734 閱讀 4241

一:什麼是左遞迴

在電腦科學裡面,左遞迴是一種遞迴的特殊狀況。  

在上下文無關文法內裡的說法,若乙個非終端符號(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集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...