現在給定如下算術表示式文法:
expr -> expr + term
| expr - term
| term
term -> term * factor
| term / factor
| factor
factor -> ( expr )
| number
| id
很明顯,上訴文法中,expr
和term
都有左遞迴。
為了消除上訴文法的左遞迴,可以將插入新的非終結符號,轉換為右遞迴。
先假定有如下產生式(α 和 β 是不以 a 開頭的終結符號/非終結符號):
a -> a α | β
因為a -> β
,所以有a -> β ε
因為a -> β
以及a -> a α
,所以有a -> β α
又因為a -> β ε
和a -> β α
。
所以有a -> β (α | ε)
讓r -> α | ε
,既有r -> αr | ε
最終文法如下:
a -> β r
r -> αr | ε
讓我們回到具體的算術表示式的文法上:
expr -> expr + term
| expr - term
| term
因為expr -> term
,所以又expr -> term ε
因為expr -> term
以及expr -> expr + term
,所以有expr -> term + term
又因為expr -> term ε
和expr -> term + term
。
所以有expr -> term ( + term | ε)
讓r -> + term | ε
,既有r -> + term r | ε
得出文法如下:
expr -> term r
r -> + term
| - term
| ε
更加詳細的消除左遞迴可以看看龍書。
expr -> term trest
trest -> + term
| - term
| εterm -> factor frest
frest -> * factor
| / factor
| εfactor -> number
| ( expr )
編譯原理 三 消除文法的左遞迴
對於任意上下文無關的文法消除左遞迴形如p p 可以通過直接消除轉化為 p p p p 有時候雖然形式上產生式沒有遞迴,但是因為形成了環,所以導致進行閉包運算後出現左遞迴,如下 s qc c q rb br sa a 雖不具有左遞迴,但s q r都是左遞迴的,因為經過若干次推導有 消除左遞迴演算法 f...
編譯原理系列 算術表示式與陣列元素翻譯
簡單算術表示式和賦值句,是指表示式和賦值句中變數是不可再分的簡單變數 過程emit result arg1 op arg2 生成 result arg1 op arg2 的三位址碼產生式 語義規則 1 a id e 2 e e1 e2 3 e e1 e2 4 e e1 5 e e1 6 e id強制...
棧之算術表示式的轉換
小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解決吧。輸入一算術表示式,以 字元作為結束標誌。資料保證無空格,只有一組輸入 ...