C語言直譯器的實現 表示式解析 四

2022-04-04 06:15:06 字數 2455 閱讀 8831

1. bnf定義

2.表示式解析

3. 字尾表示式

4.字尾表示式到中間**

5.中間**的表示

雖然不想多提理論知識,但是有些東西還是避免不了。在解析表示式的時候,我們必須知道它的bnf定義,這樣解析起來就非常方便了。所謂的bnf定義,相信大家看一眼就知道了:

exp_additive

-> exp_multiplicative ( "+"|"-" ) exp_multiplicative

exp_multiplicative

-> exp_cast ( "*"|"/"|"%" ) exp_cast

exp_cast

-> ...

知道了上面的bnf定義,那麼我們的解析**就可以這麼寫:

void exp_additive()

}void exp_multiplicative()

}過程是這樣的:

a.呼叫exp_additive時,先呼叫exp_multiplicative

b.然後判斷後面是否是 + 或 -,如果是,再次呼叫exp_multiplicative

這樣就完成了加法表示式的解析。如果非要問為什麼這麼寫就能解析出表示式,那麼我們可以舉個例子:

a = a * b + c * d;

那麼,他的語法樹應該是這樣的:

(圖4.2 語法樹)

我們向下遞迴呼叫的過程,其實就是構造這個語法樹的過程。但是我們不會真的建立出這個語法樹,而是儲存了乙個與它等價的一種形式--字尾表示式,其實字尾表示式就是語法樹的後續遍歷。

什麼是字尾表示式?我們還是從例子出發,上面的表示式,轉化成字尾表示式就是這樣子的:

a a b * c d * + =

為什麼要寫成這種奇怪的形式?我們不是吃飽了撐著,從左往右分別檢視這個表示式您就知道原因了。

a

a

b

*得到*號,那麼拿前面的兩個變數a b求和

c

d

*得到*號,那麼拿前面的兩個變數c d求和

+的到+號,獲取前面的兩個變數 a*b  c*d 的結果,求和

=得到=號,將前面的結果賦給a

為了生成字尾表示式,我們要改造上面的解析函式。

void exp_additive()

}void exp_multiplicative()

}那麼解析完成以後,我們的棧中就會形成字尾表示式了。有了表示式的字尾形式,我們就可以很輕鬆的產生字尾表示式的中間**了。

首先我們先說明一下我們的中間**是怎樣的一種形式,這裡暫且叫它為三元表示式,是因為這個種中間**的形式是固定的。例如,緊接上節的例子,表示式 a = a * b + c * d;的中間**最終應該是這樣子的:

@1 = a * b;

@2 = c * d;

@3 = @1 + @2;

@4 = a  = @3;

其中以@開頭的都是我們為之產生的中間變數。生成上述的中間**後,將會對我們後續的解析提供很大的幫助,應為它結構固定,所以我們不用再去解析源程式,而是通過這個中間**產生最終的執行**。這裡先宣告下,我所說的執行**,不是真正意義上得可執行**,而是能夠被我的軟體解析的命令序列。其實它已經非常接近彙編**。但是我們的目標是解析執行,並不產生彙編**,所以產生簡單的命令序列已經可以完成目標了。

我們前面解析表示式,產生字尾形式,為的就是生產這種中間表示式。表示式"a = a * b + c * d;"的字尾形式是"a a b * c d * + =;" 我們要根據這個字尾形式產生中間**的過程如下:

};它是乙個鍊錶,每個節點儲存了乙個形如"@1 = a * b;"的中間**。其中,opr表示運算子"*";lab表示該節點為乙個lab,留到後面章節講解;var表示運算變數,如上面表示式的"@1, a, b"。

這樣子,當乙個表示式解析完成後,會生成乙個鍊錶,表示該表示式的中間**。

解析表示式 C 實現

1.中綴 字首 字尾表示式 對於乙個人可識別的表示式 1 2 3 4 5 根據操作符的位置不同分為 中綴表示式 1 2 3 4 5 字首表示式 1 2 3 4 5 字尾表示式 1 2 3 4 5 字首表示式和字尾表示式裡面已經包含了計算順序,因此不需要括號來確定優先順序 2.中綴轉字首 2.1 中綴...

C語言求得表示式的字尾表示式

獲取字尾表示式的原理是用乙個字元陣列來存放字尾表示式,用乙個棧來暫時存放運算子,入棧出棧和字元陣列的儲存規則為 一.當字元是運算元,直接存入字元陣列中 二.當字元不是運算元,分三種情況討論 1.字元是 當前字元直接入棧 2.字元是 一直出棧,將出棧的字元存入字元陣列中,直到棧頂元素是 時,將棧頂元素...

c語言實現表示式求值

用c語言實現表示式求值演算法。要求從鍵盤輸入任意的包含加減乘除的算術四則運算表示式,都能求值。運算元型別可以設定為double。陣列棧進行操作 加減乘除和括號運算 include include include define max size 50double stacks max size cha...