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

下載本文檔

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

文檔簡介

算符優(yōu)先分析程序及報告7700字

實驗四報告實驗任務(wù):對下述描述算符表達(dá)式的算符優(yōu)先文法G[E],給出算符優(yōu)先分析的實驗結(jié)果。E->E+T|E-T|TT->T*F|T/F|FF->(E)|i說明:優(yōu)先關(guān)系矩陣的構(gòu)造過程:(1)=關(guān)系由產(chǎn)生式F->(E)知‘(’=‘)’FIRSTVT集FIRSTVT(E)={+,-,*,/,(,i}FIRSTVT(F)={(,i}FIRSTVT(T)={*,/,(,i}LASTVT(E)={+,-,*,/,),i}LASTVT(F)={),i}LASTVT(T)={*,/,),i}(2)<關(guān)系+T則有:+<FIRSTVT(T)-T則有:-<FIRSTVT(T)*F則有:*<FIRSTVT(F)/F則有:/<FIRSTVT(F)(E則有:(<FIRSTVT(E)(3)>關(guān)系E+則有:LASTVT(E)>+E-則有:LASTVT(E)>-T*則有:LASTVT(T)>*T/則有:LASTVT(T)>/E)則有:LASTVT(E)>)(4)優(yōu)先關(guān)系矩陣+-*/()i#+>><<<><>->><<<><>*>>>><><>/>>>><><>(<<<<<=<)>>>>>>i>>>>>>#<<<<<<=終結(jié)符之間的優(yōu)先關(guān)系是唯一的,所以該文法是算符優(yōu)先文法。程序的功能描述:程序由文件讀入字符串(以#結(jié)束),然后進(jìn)行算符優(yōu)先分析,分析過程中如有錯誤,則終止程序并報告錯誤位置,最終向屏幕輸出移近——規(guī)約過程。程序結(jié)構(gòu)描述程序測試方案測試用例一:i-i*i+i#運(yùn)行結(jié)果一:分析成功。測試用例二:i-i*i+(i#運(yùn)行結(jié)果二:分析失敗。實驗總結(jié)在算符優(yōu)先程序設(shè)計過程中,程序比較復(fù)雜,其中在優(yōu)先關(guān)系矩陣的構(gòu)造時遇到了非常大的困難,由于最初對程序的總體流程不是十分清晰,而且實驗中因本人馬虎將優(yōu)先關(guān)系矩陣輸入錯誤,造成了設(shè)計與調(diào)試的困難。但經(jīng)過自己的努力,通過多次調(diào)試,最終構(gòu)造出優(yōu)先關(guān)系矩陣并調(diào)試成功。通過本次實驗一定程度上提高了軟件開發(fā)能力,對編譯原理這一門課程也有了比較深刻的了解。最后,由于所學(xué)知識不夠全面,實驗在很多方面還有待完善,在以后的學(xué)習(xí)過程中,會掌握更多知識,力求做到更好。代碼#include<string.h>#include<stdlib.h>#include<ctype.h>#include<iostream>usingnamespacestd;constintmaxsize=100;//為數(shù)組str[]、in[]分配的最大存儲空間constintlength=100;//為數(shù)組array[]分配的最大存儲空間classstack{private:intsize;//size為當(dāng)前數(shù)組array[]的大小chararray[length];//用于存儲讀入的字符public:stack(){size=0;//數(shù)組array[]的初始長度為0}voidpush(charch){if(size<length)//如果數(shù)組未滿,則壓入{array[size]=ch;size++;}else//若數(shù)組已滿,則給出出錯信息cout<<"overflow!"<<endl;}intpop(charch[],intlen)//彈出字符準(zhǔn)備規(guī)約{if(size-len>=0){for(inti=0;i<len;i++)ch[i]=array[size-len+i];size-=len;returnlen;}else{cout<<"參數(shù)錯誤!"<<endl;return0;}}charsaomiao(intpos)//判斷大小是否合法{if(pos>=0&&pos<size)returnarray[pos];return'\0';}voidsaomiaosuoyou()//輸出當(dāng)前數(shù)組中的字符{for(inti=0;i<getsize();i++)cout<<saomiao(i);cout<<endl;}intgetsize()//返回當(dāng)前數(shù)組大小{returnsize;}};charguiyue(charch[])//規(guī)約為'M'{return'M';}intisnumch(charch)//判斷ch是不是數(shù)字或小寫字母{return(ch>='0'&&ch<='9'||ch>='a'&&ch<='z');}intgetrank(charch1,charch2)//根據(jù)算符優(yōu)先分析矩陣設(shè)置讀入優(yōu)先次序{//0表示等于,1表示大于,-1表示小于,2表示沒有優(yōu)先關(guān)系if(isnumch(ch1))ch1='i';if(isnumch(ch2))ch2='i';if(ch1=='+'||ch1=='-'){if(ch2=='+'||ch2=='#'||ch2==')'||ch2=='-')return1;elsereturn-1;}if(ch1=='*'||ch1=='/'){if(ch2=='('||ch2=='i')return-1;elsereturn1;}if(ch1=='('){if(ch2==')')return0;elseif(ch2=='#')return2;elsereturn-1;}if(ch1=='i'||ch1==')'){if(ch2=='i'||ch2=='(')return2;elsereturn1;}if(ch1=='#'){if(ch2=='#')return0;elseif(ch2==')')return2;elsereturn-1;}return2;}intisvt(charch)//區(qū)別參加規(guī)約的資格{if(ch>='a'&&ch<='z')return1;if(ch>='('&&ch<='+')return1;if(ch=='#')return1;if(ch=='/')return1;if(ch=='-')return1;if(ch>='0'&&ch<='9')return1;return0;}/****************主函數(shù)**************/voidmain(){charjuzhen[9][9]={'','+','-','*','/','(',')','i','#','+','>','>','<','<','<','>','<','>','-','>','>','<','<','<','>','<','>','*','>','>','>','>','<','>','<','>','/','>','>','>','>','<','>','<','>','(','<','<','<','<','<','=','<','',')','>','>','>','>','','>','','>','i','>','>','>','>','','>','','>','#','<','<','<','<','<','','<','=',};cout<<"******此文法的算符優(yōu)先矩陣如下所示*******"<<endl;for(inti=0;i<=8;i++)//輸出算符優(yōu)先矩陣{for(intj=0;j<=8;j++){cout<<juzhen[i][j]<<"";}cout<<endl;}charin[maxsize];//用于接收輸入文件名charstr[maxsize];FILE*fin;//用于指向輸入文件的指針cout<<"請輸入源程序文件名(例如1.txt):";cin>>in;if((fin=fopen(in,"r"))==NULL)//判斷輸入文件名是否正確{cout<<endl<<"打開詞法分析輸入文件出錯!"<<endl;}intm=0;charch1='a';while(ch1!='#')//從文件中讀入一串字符{ch1=getc(fin);str[m++]=ch1;}str[m]='#';//將'#'賦給字符串尾stacks;//定義stack類的變量sintlen;len=int(strlen(str));//取出輸入字符串的長度s.push('#');//先把'#'壓入數(shù)組array[]intk=s.getsize()-1,t=0,j;//k為當(dāng)前數(shù)組array[]讀入已讀入字符的位置標(biāo)識,//t為輸入字符串?dāng)?shù)組str[]即將被讀的字符位置標(biāo)識,//j用于記錄當(dāng)前數(shù)組array[]中的最后一個非終結(jié)符的位置chara=str[0];//a用于傳遞即將讀入的字符while(a!='#')//如果a不等于'#',則繼續(xù)讀入操作或規(guī)約操作{a=str[t];if(isvt(s.saomiao(k)))j=k;elsej=k-1;while(isvt(a)&&getrank(s.saomiao(j),a)==1)//判斷是否滿足規(guī)約的條件{inth=j,low=j-1;//h記錄要規(guī)約的位置,low記錄規(guī)約后數(shù)組array[]中的最后一個非終結(jié)符的位置if(!isvt(s.saomiao(low)))low--;while(getrank(s.saomiao(low),s.saomiao(h))!=-1)//尋找最后一個非終結(jié)符的位置用low記錄{h=low;low--;if(!isvt(s.saomiao(low)))low--;}h=s.getsize()-1;low++;intlen=h-low+1;//len記錄要規(guī)約的長度charch[10];for(intp=0;p<10;p++)ch[p]='\0';s.pop(ch,len);//彈出要規(guī)約的字符用字符串ch存儲charc=guiyue(ch);//將ch規(guī)約為Ms.push(c);//再將規(guī)約后的M壓入數(shù)組中cout<<ch<<"規(guī)約為"<<guiyue(ch)<<endl;s.saomiaosuoyou();//規(guī)約后輸出當(dāng)前數(shù)組array[]中的字符j=s.getsize()-1;if(!isvt(s.saomiao(j)))j--;}if(!(a>='A'&&a<='Z')&&getrank(s.saomiao(j),a)==2)//當(dāng)待輸入字符不是大寫字母且與前一個{//非終結(jié)符無優(yōu)先關(guān)系則提示出錯并給出提示cout<<"你的輸入有錯誤!"<<endl;cout<<"錯誤為第"<<t+1<<"個字符:"<<str[t]<<endl;exit(0);}else{cout<<"移近:"<<a<<endl;s.push

溫馨提示

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

評論

0/150

提交評論