編譯原理之消除算術表示式文法的左遞迴

2021-07-12 05:27:09 字數 1621 閱讀 6170

現在給定如下算術表示式文法:

expr -> expr + term     

| expr - term

| term

term -> term * factor

| term / factor

| factor

factor -> ( expr )

| number

| id

很明顯,上訴文法中,exprterm都有左遞迴。

為了消除上訴文法的左遞迴,可以將插入新的非終結符號,轉換為右遞迴。

先假定有如下產生式(α 和 β 是不以 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強制...

棧之算術表示式的轉換

小明在學習了資料結構之後,突然想起了以前沒有解決的算術表示式轉化成字尾式的問題,今天他想解決一下。因為有了資料結構的基礎小明很快就解出了這個問題,但是他突然想到怎麼求出算術表示式的字首式和中綴式呢?小明很困惑。聰明的你幫他解決吧。輸入一算術表示式,以 字元作為結束標誌。資料保證無空格,只有一組輸入 ...