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

下載本文檔

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

文檔簡(jiǎn)介

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

實(shí)驗(yàn)四報(bào)告實(shí)驗(yàn)任務(wù):對(duì)下述描述算符表達(dá)式的算符優(yōu)先文法G[E],給出算符優(yōu)先分析的實(shí)驗(yàn)結(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)先分析,分析過程中如有錯(cuò)誤,則終止程序并報(bào)告錯(cuò)誤位置,最終向屏幕輸出移近——規(guī)約過程。程序結(jié)構(gòu)描述程序測(cè)試方案測(cè)試用例一:i-i*i+i#運(yùn)行結(jié)果一:分析成功。測(cè)試用例二:i-i*i+(i#運(yùn)行結(jié)果二:分析失敗。實(shí)驗(yàn)總結(jié)在算符優(yōu)先程序設(shè)計(jì)過程中,程序比較復(fù)雜,其中在優(yōu)先關(guān)系矩陣的構(gòu)造時(shí)遇到了非常大的困難,由于最初對(duì)程序的總體流程不是十分清晰,而且實(shí)驗(yàn)中因本人馬虎將優(yōu)先關(guān)系矩陣輸入錯(cuò)誤,造成了設(shè)計(jì)與調(diào)試的困難。但經(jīng)過自己的努力,通過多次調(diào)試,最終構(gòu)造出優(yōu)先關(guān)系矩陣并調(diào)試成功。通過本次實(shí)驗(yàn)一定程度上提高了軟件開發(fā)能力,對(duì)編譯原理這一門課程也有了比較深刻的了解。最后,由于所學(xué)知識(shí)不夠全面,實(shí)驗(yàn)在很多方面還有待完善,在以后的學(xué)習(xí)過程中,會(huì)掌握更多知識(shí),力求做到更好。代碼#include<string.h>#include<stdlib.h>#include<ctype.h>#include<iostream>usingnamespacestd;constintmaxsize=100;//為數(shù)組str[]、in[]分配的最大存儲(chǔ)空間constintlength=100;//為數(shù)組array[]分配的最大存儲(chǔ)空間classstack{private:intsize;//size為當(dāng)前數(shù)組array[]的大小chararray[length];//用于存儲(chǔ)讀入的字符public:stack(){size=0;//數(shù)組array[]的初始長(zhǎng)度為0}voidpush(charch){if(size<length)//如果數(shù)組未滿,則壓入{array[size]=ch;size++;}else//若數(shù)組已滿,則給出出錯(cuò)信息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ù)錯(cuò)誤!"<<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<<"請(qǐng)輸入源程序文件名(例如1.txt):";cin>>in;if((fin=fopen(in,"r"))==NULL)//判斷輸入文件名是否正確{cout<<endl<<"打開詞法分析輸入文件出錯(cuò)!"<<endl;}intm=0;charch1='a';while(ch1!='#')//從文件中讀入一串字符{ch1=getc(fin);str[m++]=ch1;}str[m]='#';//將'#'賦給字符串尾stacks;//定義stack類的變量sintlen;len=int(strlen(str));//取出輸入字符串的長(zhǎng)度s.push('#');//先把'#'壓入數(shù)組array[]intk=s.getsize()-1,t=0,j;//k為當(dāng)前數(shù)組array[]讀入已讀入字符的位置標(biāo)識(shí),//t為輸入字符串?dāng)?shù)組str[]即將被讀的字符位置標(biāo)識(shí),//j用于記錄當(dāng)前數(shù)組array[]中的最后一個(gè)非終結(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[]中的最后一個(gè)非終結(jié)符的位置if(!isvt(s.saomiao(low)))low--;while(getrank(s.saomiao(low),s.saomiao(h))!=-1)//尋找最后一個(gè)非終結(jié)符的位置用low記錄{h=low;low--;if(!isvt(s.saomiao(low)))low--;}h=s.getsize()-1;low++;intlen=h-low+1;//len記錄要規(guī)約的長(zhǎng)度charch[10];for(intp=0;p<10;p++)ch[p]='\0';s.pop(ch,len);//彈出要規(guī)約的字符用字符串ch存儲(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)待輸入字符不是大寫字母且與前一個(gè){//非終結(jié)符無優(yōu)先關(guān)系則提示出錯(cuò)并給出提示cout<<"你的輸入有錯(cuò)誤!"<<endl;cout<<"錯(cuò)誤為第"<<t+1<<"個(gè)字符:"<<str[t]<<endl;exit(0);}else{cout<<"移近:"<<a<<endl;s.push

溫馨提示

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

評(píng)論

0/150

提交評(píng)論