編譯原理實驗報告6-逆波蘭式的翻譯和計算(共7頁)_第1頁
編譯原理實驗報告6-逆波蘭式的翻譯和計算(共7頁)_第2頁
編譯原理實驗報告6-逆波蘭式的翻譯和計算(共7頁)_第3頁
編譯原理實驗報告6-逆波蘭式的翻譯和計算(共7頁)_第4頁
編譯原理實驗報告6-逆波蘭式的翻譯和計算(共7頁)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實驗6 逆波蘭式的翻譯和計算一、實驗目的通過實驗加深對語法指導翻譯原理的理解,掌握算符優(yōu)先分析的方法,將語法分析所識別的表達式變換成中間代碼的翻譯方法。 二、實驗內(nèi)容設計一個表示能把普通表達式(中綴式)翻譯成后綴式,并計算出結果的程序。三、實驗要求1、給出文法如下: GE E->T|E+T; T->F|T*F; F->i(E); 對應的轉化為逆波蘭式的語義動作如下:E-> E(1)op E(2) E.CODE:= E(1).CODE|E(2).CODE|opE->(E(1) E.CODE := E(1).CODE E->i

2、d E.CODE := id2、利用實驗5中的算符優(yōu)先分析算法,結合上面給出的語義動作實現(xiàn)逆波蘭式的構造;3、利用棧,計算生成的逆波蘭式,步驟如下:1) 中綴表達式,從文本文件讀入,每一行存放一個表達式,為了降低難度,表達式采用常數(shù)表達式;2) 利用結合語法制導翻譯的算符優(yōu)先分析,構造逆波蘭式;3) 利用棧計算出后綴式的結果,并輸出; 四、實驗環(huán)境PC微機DOS操作系統(tǒng)或 Windows 操作系統(tǒng)Turbo C 程序集成環(huán)境或 Visual C+ 程序集成環(huán)境 五、實驗步驟 1、了解語法制導翻譯的方法,學習后綴式構造的語義動作; 2、結合實驗5的算符優(yōu)先程序,設計程序構造后

3、綴式;3、利用棧,編程實現(xiàn)后綴式的計算;4、測試程序運行效果:從文本文件中讀表達式,在屏幕上輸出,檢查輸出結果。 六、測試數(shù)據(jù) 輸入數(shù)據(jù):編輯一個文本文文件expression.txt,在文件中輸入如下內(nèi)容:1+2;(1+2)*3;(10+20)*30+(50+60*70);正確結果:(1)1+2;輸出:1,2,+ 3(2)(1+2)*3;輸出:1,2,+,3,* 9(3)(10+20)*30+(50+60*70)輸出:10,20,+30,*50,60,70,*,+,+ 5150七、實驗報告要求實驗報告應包括以下幾個部分:1、 構造逆波蘭式的語義動作;2、 結合算符優(yōu)先分析構造逆波蘭

4、式的算法和過程;3、 語法制導翻譯的運行方法;4、 程序的測試結果和問題;5、 實驗總結。八、實驗內(nèi)容源代碼:#include<iostream>#include<stdio.h> #include<math.h>using namespace std;#define max 100 char exmax;int n;char GetBC(FILE* fp) /讀取文件的字符直至ch不是空白char ch;do ch = fgetc(fp); while (ch = ' ' | ch = 't' | ch = 'n&#

5、39;);return ch;void acquire(FILE* fp)char strmax;char stackmax;char ch;int sum, i, j, t, top = 0;i = 0;/*讀取一行表達式*/GetBC(fp);if (feof(fp)return;else fseek(fp, -1L, 1);printf("n(%d)", n);n+;doi+;stri = GetBC(fp); while (stri != '' && i != max);sum = i;t = 1;i = 1;ch = stri;i+

6、;while (ch != '')switch (ch)case '(':top+; stacktop = ch;break;case ')':while (stacktop != '(') ext = stacktop;top-;t+;top-;break;case '+':case '-':while (top != 0 && stacktop != '(') ext = stacktop;top-;t+;top+;stacktop = ch;break;case

7、 '*':case '/':while (stacktop = '*' | stacktop = '/')ext = stacktop;top-;t+;top+;stacktop = ch;break;case ' ':break;default:while (ch >= '0'&&ch <= '9')ext = ch;t+;/*ex 中存放逆波蘭式 */ch = stri;i+;/*str 中存放中綴表達式*/i-;ext = ','t+

8、;break;ch = stri;i+;/*當中綴表達式掃描完畢,檢查棧是否為空,若不空則一一退棧*/while (top != 0) ext = stacktop;t+;top-;ext = ''for (j = 1; j < sum; j+)printf("%c", strj);printf("n輸出:");for (j = 1; j < t; j+)printf("%c", exj);void getValue() float stackmax, d;char ch;int t = 1, top =

9、0;ch = ext;t+;while (ch != '')switch (ch)case '+':stacktop - 1 = stacktop - 1 + stacktop;top-;break;case '-':stacktop - 1 = stacktop - 1 - stacktop;top-;break;case '*':stacktop - 1 = stacktop - 1 * stacktop;top-;break;case '/':if (stacktop != 0)stacktop - 1 =

10、stacktop - 1 / stacktop;elseprintf("除零錯誤n");break;/*異常退出*/top-;break;/*將數(shù)字字符轉化為對應的數(shù)值*/default:d = 0;while (ch >= '0'&&ch <= '9') d = 10 * d + ch - '0'ch = ext; t+;top+;stacktop = d;ch = ext;t+;printf("t%gn", stacktop);void main() FILE* fp;err

11、no_t err;if (err = fopen_s(&fp, "C:UsersAdministratorDesktopexpression.txt", "r") != NULL) /以只讀方式打開文件,失敗則退出程序printf("file can not open!");exit(0);n = 1;printf("逆波蘭式的翻譯和計算結果如下:n");while (1) acquire(fp);if (feof(fp)break;getValue();fclose(fp);fp = NULL;實驗結果:

12、 問題:這次實驗較之之前不同,在設計算法與數(shù)據(jù)結構上花的時間較少,因為之前在數(shù)據(jù)結構課程里做過使用堆棧完成表達式的計算,也學過中綴式和后綴式,所以代碼編得較快,但是其中的算法其實是較復雜的,調(diào)試時顯得更復雜而編程時我用的是VS,在調(diào)試開始時,斷點是不能增加的,這樣影響了調(diào)試的進度,其實之前做實驗就注意到了,只是沒有特別在意,但這個實驗的算法較復雜,斷點設得較多,這讓我想到使用JAVA,也許使用java開發(fā)會更容易,調(diào)試的問題也可以解決,主要是使用現(xiàn)在對于C+的熟練程度遠不如Java,如果能充分使用類和對象的特點,各種算法的實現(xiàn)將更加有條理,更易讀易修改。實驗總結:這是最后一個實驗了,較之之前的實驗難一些,但有著之前的實驗作基礎,加上理論課的知識,又使用堆棧這個極佳的數(shù)據(jù)結構,算法也是之前數(shù)據(jù)結構課程里接觸過的,所以只要認真仔細,之后做好調(diào)試,也可以做得很快。經(jīng)過這次實驗再加上實驗五的算符優(yōu)先程序,對于算符優(yōu)先文法的了解更深刻了,能感覺到對于表達式,使用算符優(yōu)先文法是非常合適的,句型里不存在兩個非終結符相鄰,兩個非終結符之間至少含有一個終結符,這個算符優(yōu)先文法的特點是最主要的。九、思考題1、 語

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論