編譯原理 逆波蘭式分析計算

2021-10-06 16:57:11 字數 4012 閱讀 9601

將非字尾式用來表示的算術表示式轉換為用逆波蘭式來表示的算術表示式,並計算用逆波蘭式來表示的算術表示式的值。

1、逆波蘭式定義

將運算物件寫在前面,而把運算符號寫在後面。用這種表示法表示的表示式也稱做字尾式。逆波蘭式的特點在於運算物件順序不變,運算符號位置反映運算順序。採用逆波蘭式可以很好的表示簡單算術表示式,其優點在於易於計算機處理表示式。

2、產生逆波蘭式的前提

中綴算術表示式

3、逆波蘭式生成的實驗設計思想及演算法

(1)首先構造乙個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。

(2)讀入乙個用中綴表示的簡單算術表示式,為方便起見,設該簡單算術表示式的右端多加上了優先順序最低的特殊符號「#」。

(3)從左至右掃瞄該算術表示式,從第乙個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。

(4)如果不是數字,該字元則是運算子,此時需比較優先關係。

做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運算子入棧。倘若不是的話,則將此運算子棧頂的運算子從棧中彈出,將該字元入棧。

(5)重複上述操作(1)-(2)直至掃瞄完整個簡單算術表示式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表示式轉化為逆波蘭表示的簡單算術表示式。

3、逆波蘭式計算的實驗設計思想及演算法

(1)構造乙個棧,存放運算物件。

(2)讀入乙個用逆波蘭式表示的簡單算術表示式。

(3)自左至右掃瞄該簡單算術表示式並判斷該字元,如果該字元是運算物件,則將該字元入棧。若是運算子,如果此運算子是二目運算子,則將對棧頂部的兩個運算物件進行該運算,將運算結果入棧,並且將執行該運算的兩個運算物件從棧頂彈出。如果該字元是一目運算子,則對棧頂部的元素實施該運算,將該棧頂部的元素彈出,將運算結果入棧。

(4)重複上述操作直至掃瞄完整個簡單算術表示式的逆波蘭式,確定所有字元都得到正確處理,我們便可以求出該簡單算術表示式的值。

dev-c++

(一)準備:

1.閱讀課本有關章節,

2.考慮好設計方案;

3.設計出模組結構、測試資料,初步編制好程式。

(二)上課上機:

將源**拷貝到機上除錯,發現錯誤,再修改完善。第二次上機除錯通過。

(三)程式要求:

程式輸入/輸出示例:

輸出的格式如下:

(1)逆波蘭式的生成及計算程式,編制人:姓名,學號,班級

(2)輸入一以#結束的中綴表示式(包括+—/()數字#):在此位置輸入符號串如4(28+876-75)/8

(3)逆波蘭式為:4&28&87&6+75-8/

(4)逆波蘭式test4&28&87&6+75-*8/=計算結果為237.5

備註:(1)在生成的逆波蘭式中如果兩個數相連則用&分隔,如28和87,中間用&分隔;

(2)在此位置輸入符號串為使用者自行輸入的符號串。

注意:1.表示式中允許使用運算子(±*/)、分割符(括號)、數字,結束符#;

2.如果遇到錯誤的表示式,應輸出錯誤提示資訊(該資訊越詳細越好);

3.對學有餘力的同學,測試用的表示式事先放在文字檔案中,一行存放乙個表示式,同時以分號分割。同時將預期的輸出結果寫在另乙個文字檔案中,以便和輸出進行對照;

(四)程式思路

模組結構:

(1)定義部分:定義常量、變數、資料結構。

(2)初始化:設立算符優先分析表、初始化變數空間(包括堆疊、結構體、陣列、臨時變數等);

(3)控制部分:從鍵盤輸入乙個表示式符號串;

(4)利用算符優先分析演算法進行表示式處理:根據算符優先分析表對表示式符號串進行堆疊(或其他)操作,輸出分析結果,如果遇到錯誤則顯示錯誤資訊。

(5)對生成的逆波蘭式進行計算。

(五)練習該實驗的目的和思路:

程式較複雜,需要利用到程式語言的知識和大量程式設計技巧,逆波蘭式的生成是算符優先分析法的應用,是一種較實用的分析法,通過這個練習可大大提高軟體開發能力。

(六)為了能設計好程式,注意以下事情:

1.模組設計:將程式分成合理的多個模組(函式),每個模組做具體的同一事情。

2.寫出(畫出)設計方案:模組關係簡圖、流程圖、全域性變數、函式介面等。

3.程式設計時注意程式設計風格:空行的使用、注釋的使用、縮排的使用等。

#include

#include

#include

#include

#define max 100

void

compvalue

(char ex[max]);

void

trans

(int p)

;int

main()

return0;

}/*將算術表示式轉化為字尾表示式*/

void

trans

(int p)

top--

;break

;case

'+':

//判定為加減號

case

'-':

while

(top!=

0&&stack[top]

!='('

) top++

;stack[top]

=ch;

break

;case

'*':

//判定為乘除號

case

'/':

while

(stack[top]

=='*'

||stack[top]

=='/'

) top++

;stack[top]

=ch;

break

;case

' ':

break

;default

:while

(ch>=

'0'&&ch<=

'9')

i--; ex[t]

='&'

;t++;}

ch=str[i]

;i++;}

while

(top!=0)

ex[t]

='#'

;printf

("\n\t原來表示式:");

for(j=

0;j)printf

("%c"

,str[j]);

printf

("\n\t字尾表示式:"

,ex)

;for

(j=0

;j)printf

("%c"

,ex[j]);

compvalue

(ex);}

/*計算字尾表示式的值*/

void

compvalue

(char ex[max]

) top--

;break

;default

: d=0;

while

(ch>=

'0'&&ch<=

'9')

top++

; stack[top]

=d;}

ch=ex[t]

;t++;}

printf

("\n\t計算結果:%g\n"

檔案讀取的本地文字內容:

通過本次實驗,我更清楚的理解了算符優先分析表,將中綴表示式轉換為逆波蘭式的過程,以及對逆波蘭式的計算,通過檔案讀取方式將待計算的本地所有中綴表示式一一讀取計算,列印出相對應的值。

編譯原理 逆波蘭式分析程式 C

將非字尾式用來表示的算術表示式轉換為用逆波蘭式來表示的算術表示式,並計算用逆波蘭式來表示的算術表示式的值。1.分析出完整的運算數或者運算子 參考詞法分析 0代表數字,1代表運算子 tuple為元組資料型別。static tuplereadobject string inputstring 2.遇到操...

波蘭式和逆波蘭式

字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前.中綴和字尾同理 雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計...

逆波蘭計算器原理

字首表示式 符號在前左,數字在右。符號數字位置考慮運算優先順序。中綴表示式 符號在數字中間 即正常書寫的表式結構 1 2 3 4 5 字尾 表示式 將要進行的部分運算的數字在前運算符號在後,接著其它部分的運算。計算表示式一般包含數值,運算子,括號,包括運算子的優先順序計算,以及括號產生的優先順序運算...