算符優(yōu)先分析程序及報告_第1頁
算符優(yōu)先分析程序及報告_第2頁
算符優(yōu)先分析程序及報告_第3頁
算符優(yōu)先分析程序及報告_第4頁
算符優(yōu)先分析程序及報告_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗四報告實驗任務: 對下述描述算符表達式的算符優(yōu)先文法GE,給出算符優(yōu)先分析的實驗結果。E-E+T|E-T|T T-T*F|T/F|F F-(E)|i說明:優(yōu)先關系矩陣的構造過程:(1) = 關系由產生式 F-(E) 知 (=)FIRSTVT集FIRSTVT(E)= +,-,*,/,(,i FIRSTVT(F)= (,i FIRSTVT(T)= *,/,(,i LASTVT(E)= +,-,*,/,),i LASTVT(F)= ),i LASTVT(T)= *,/,),i (2) 關系+T 則有:+ FIRSTVT(T)-T 則有:- FIRSTVT(T)*F 則有:* FIRSTVT(F)

2、/F 則有:/ FIRSTVT(F)(E 則有:( 關系E+ 則有: LASTVT(E) +E- 則有: LASTVT(E) -T* 則有: LASTVT(T) *T/ 則有: LASTVT(T) /E) 則有: LASTVT(E) )(4)優(yōu)先關系矩陣 + - * / ( ) i #+ - * / ( = i # = 終結符之間的優(yōu)先關系是唯一的,所以該文法是算符優(yōu)先文法。程序的功能描述:程序由文件讀入字符串(以#結束),然后進行算符優(yōu)先分析,分析過程中如有錯誤,則終止程序并報告錯誤位置,最終向屏幕輸出移近規(guī)約過程。程序結構描述打開文件打開文件成功成功Na的優(yōu)先關系大于數組array 中的最

3、后一個終結符從數組str 中讀取一個字符a將#壓入a的優(yōu)先關系大于數組array 中的最后一個終結符從數組str 中讀取一個字符a將#壓入數組array 從文件中讀入字符串 賦給數組str N將數組將數組array 中優(yōu)先關系一樣的字符規(guī)約為M將a移近數組array Y N將a移近數組array sixeof array sixeof array =0Y結束程序測試方案測試用例一:i-i*i+i#運行結果一:分析成功。測試用例二:i*i+(i#運行結果二:分析失敗。實驗總結在算符優(yōu)先程序設計過程中,程序比較復雜,其中在優(yōu)先關系矩陣的構造時遇到了非常大的困難,由于最初對程序的總體流程不是十分清晰

4、,而且實驗中因本人馬虎將優(yōu)先關系矩陣輸入錯誤,造成了設計與調試的困難。但經過自己的努力,通過多次調試,最終構造出優(yōu)先關系矩陣并調試成功。通過本次實驗一定程度上提高了軟件開發(fā)能力,對編譯原理這一門課程也有了比較深刻的了解。最后,由于所學知識不夠全面,實驗在很多方面還有待完善,在以后的學習過程中,會掌握更多知識,力求做到更好。代碼#include#include#include #includeusing namespace std;const int maxsize=100; /為數組str、in分配的最大存儲空間const int length=100;/為數組array分配的最大存儲空間cl

5、ass stackprivate:int size;/size為當前數組array的大小char arraylength;/用于存儲讀入的字符public:stack()size=0;/數組array的初始長度為0void push(char ch)if(sizelength)/如果數組未滿,則壓入arraysize=ch; size+;else/若數組已滿,則給出出錯信息coutoverflow!=0)for(int i=0;ilen;i+)chi=arraysize-len+i; size-=len; return len;elsecout參數錯誤!=0&possize)return ar

6、raypos; return 0;void saomiaosuoyou()/輸出當前數組中的字符for(int i=0;igetsize();i+)coutsaomiao(i);cout=0&ch=a&ch=a&ch=(&ch=0&ch, -, *, /, (,=, , , i, , , #, ,=,;cout*此文法的算符優(yōu)先矩陣如下所示*endl;for(int i=0;i=8;i+) /輸出算符優(yōu)先矩陣for(int j=0;j=8;j+) coutjuzhenij ; coutendl;char inmaxsize; /用于接收輸入文件名 char strmaxsize;FILE *f

7、in; /用于指向輸入文件的指針 coutin; if (fin=fopen(in,r)=NULL) /判斷輸入文件名是否正確 coutendl打開詞法分析輸入文件出錯!endl; int m=0; char ch1=a; while (ch1!=#)/從文件中讀入一串字符 ch1=getc(fin); strm+=ch1; strm=#;/將#賦給字符串尾 stack s;/定義stack類的變量s int len; len=int(strlen(str);/取出輸入字符串的長度 s.push(#);/先把#壓入數組array int k=s.getsize()-1,t=0,j;/k為當前數

8、組array讀入已讀入字符的位置標識, /t為輸入字符串數組str即將被讀的字符位置標識, /j用于記錄當前數組array中的最后一個非終結符的位置 char a=str0;/a用于傳遞即將讀入的字符 while(a!=#)/如果a不等于#,則繼續(xù)讀入操作或規(guī)約操作a=strt; if(isvt(s.saomiao(k) j=k; else j=k-1; while(isvt(a)&getrank(s.saomiao(j),a)=1)/判斷是否滿足規(guī)約的條件 int h=j,low=j-1;/h記錄要規(guī)約的位置,low記錄規(guī)約后數組array中的最后一個非終結符的位置 if(!isvt(s.s

9、aomiao(low) low-; while(getrank(s.saomiao(low),s.saomiao(h)!=-1)/尋找最后一個非終結符的位置用low記錄 h=low; low-; if(!isvt(s.saomiao(low)low-; h=s.getsize()-1; low+; int len=h-low+1; /len記錄要規(guī)約的長度 char ch10; for(int p=0;p10;p+) chp=0; s.pop(ch,len);/彈出要規(guī)約的字符用字符串ch存儲 char c=guiyue(ch);/將ch規(guī)約為Ms.push(c);/再將規(guī)約后的M壓入數組中 coutch 規(guī)約為 guiyue(ch)=A&a=Z)&getrank(s.saomiao(j),a)=2)/當待輸入字符不是大寫字母且與前一個 /非終結符無優(yōu)先關系則提示出錯并給出提示 cout你的輸入有錯誤!endl; cout錯誤為第 t+1個字符 :strtendl; exit(0); else cout移近 :aendl; s.push(a);/將a壓入數組array s.saomiaosuoyou();/讀入后輸出當前數組array中的字符

溫馨提示

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

評論

0/150

提交評論