編譯原理實(shí)驗(yàn)一詞法分析器_第1頁
編譯原理實(shí)驗(yàn)一詞法分析器_第2頁
編譯原理實(shí)驗(yàn)一詞法分析器_第3頁
編譯原理實(shí)驗(yàn)一詞法分析器_第4頁
編譯原理實(shí)驗(yàn)一詞法分析器_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGE實(shí)驗(yàn)報(bào)告課程名稱編譯原理實(shí)驗(yàn)名稱詞法分析器實(shí)驗(yàn)類型設(shè)計(jì)型實(shí)驗(yàn)地點(diǎn)405機(jī)房實(shí)驗(yàn)日期2015/12指導(dǎo)教師專業(yè)軟件工程班級(jí)學(xué)號(hào)姓名成績遼寧石油化工大學(xué)計(jì)算機(jī)與通信工程學(xué)院實(shí)驗(yàn)報(bào)告說明1、封面內(nèi)容(1)課程名稱:實(shí)驗(yàn)所屬的課程的名稱。(2)實(shí)驗(yàn)名稱:要用最簡練的語言反映實(shí)驗(yàn)的內(nèi)容。要求與實(shí)驗(yàn)指導(dǎo)書中相一致。(3)實(shí)驗(yàn)類型:說明是驗(yàn)證型實(shí)驗(yàn)、設(shè)計(jì)型實(shí)驗(yàn)、創(chuàng)新型實(shí)驗(yàn)還是綜合型實(shí)驗(yàn)。2、正文內(nèi)容 實(shí)驗(yàn)報(bào)告的正文內(nèi)容須包括以下內(nèi)容:(1)實(shí)驗(yàn)?zāi)康模耗康囊鞔_,要抓住重點(diǎn),符合實(shí)驗(yàn)指導(dǎo)書中的要求。(2)實(shí)驗(yàn)內(nèi)容:說明本實(shí)驗(yàn)的主要內(nèi)容。(3)實(shí)驗(yàn)原理:簡要說明本實(shí)驗(yàn)項(xiàng)目所涉及的理論知識(shí)。(4)實(shí)驗(yàn)環(huán)境:實(shí)驗(yàn)用的軟硬件環(huán)境(配置)。(5)實(shí)驗(yàn)方案:對(duì)于驗(yàn)證性型實(shí)驗(yàn),寫明依據(jù)何種原理、操作方法進(jìn)行實(shí)驗(yàn);對(duì)于設(shè)計(jì)型和綜合型實(shí)驗(yàn),寫明依據(jù)何種原理、操作方法進(jìn)行實(shí)驗(yàn),并畫出硬件組成圖、軟件流程圖、設(shè)計(jì)思路和設(shè)計(jì)方法,再配以相應(yīng)的文字說明;對(duì)于創(chuàng)新型實(shí)驗(yàn),除符合設(shè)計(jì)型和綜合型實(shí)驗(yàn)要求外,還應(yīng)注明其創(chuàng)新點(diǎn)、特色。(6)實(shí)驗(yàn)步驟:寫明實(shí)驗(yàn)的實(shí)施步驟,包括實(shí)驗(yàn)過程中的記錄、數(shù)據(jù)。(7)實(shí)驗(yàn)結(jié)果與分析:寫明實(shí)驗(yàn)的最終結(jié)果,并對(duì)結(jié)果進(jìn)行分析,做出結(jié)論。(8)實(shí)驗(yàn)中遇到的問題及解決方法:寫明實(shí)驗(yàn)過程中遇到的問題及所采取的解決方法。(9)實(shí)驗(yàn)總結(jié)(在封底上):寫出對(duì)本次實(shí)驗(yàn)的心得體會(huì)、思考和建議。12-第頁實(shí)驗(yàn)?zāi)康脑O(shè)計(jì),編制,調(diào)試一個(gè)詞法分析程序-識(shí)別單詞,加深對(duì)詞法分析原理的理解。實(shí)驗(yàn)要求構(gòu)造一個(gè)自己設(shè)計(jì)的小語言的詞法分析器:1、這個(gè)小語言能說明一些簡單的變量識(shí)別諸如begin,end,if,while等保留字;識(shí)別非保留字的一般標(biāo)識(shí)符(有下劃線、字符、數(shù)字,且第一個(gè)字符不能是數(shù)字)。識(shí)別數(shù)字序列(整數(shù)和小數(shù));識(shí)別:=,<=,>=之類的特殊符號(hào)以及;,(,)等界符。2、相關(guān)過程(函數(shù)):Scanner()詞法掃描程序,提取標(biāo)識(shí)符并填入display表中3、這個(gè)小語言有順序結(jié)構(gòu)的語句4、這個(gè)小語言能表達(dá)分支結(jié)構(gòu)的語句5、這個(gè)小語言能夠輸出結(jié)果;算法設(shè)計(jì)單詞種別碼設(shè)計(jì):狀態(tài)種別編碼種類解釋0初態(tài)121關(guān)鍵字32變量標(biāo)識(shí)符由字母下劃線數(shù)字組成,且第一位不能是數(shù)字4讀入了數(shù)字53整數(shù)64小數(shù)7小數(shù)點(diǎn)個(gè)數(shù)出錯(cuò),大于18讀入了<96雙目運(yùn)算<>、<=105單目運(yùn)算<11讀入了>126雙目運(yùn)算>=135單目運(yùn)算>145單目運(yùn)算+、—、*、/、=、#用default實(shí)現(xiàn)15讀入了:166雙目運(yùn)算:=177界符(、)、,、;、—、[、]、:、{、}、‘’用變量errorflag實(shí)現(xiàn)程序源代碼1使用環(huán)境:vc++6.0,win8;2源代碼:#include<iostream>#include<fstream>#include<string>#include<math.h>#include<ctype.h>#include<cstdlib>usingnamespacestd;#defineMax655 #defineWordMaxNum256 //變量最大個(gè)數(shù)#defineDigitNum256 //常量最大個(gè)數(shù)#defineMaxKeyWord 32 //關(guān)鍵字?jǐn)?shù)量#defineMaxOptANum8 //運(yùn)算符最大個(gè)數(shù)#defineMaxOptBNum4 //運(yùn)算符最大個(gè)數(shù)#defineMaxEndNum11 //界符最大個(gè)數(shù)typedefstructDisplayTable{ intIndex;//標(biāo)識(shí)符所在表的下標(biāo) inttype; //標(biāo)識(shí)符的類型 intline; //標(biāo)識(shí)符所在表的行數(shù) charsymbol[20]; //標(biāo)識(shí)符所在表的名稱}Table;intTableNum=0;//display表的下標(biāo)charWord[WordMaxNum][20];//標(biāo)識(shí)符表charDigit[WordMaxNum][20];//數(shù)字表intWordNum=0;//變量表的下標(biāo)intDigNum=0; //常量表的下標(biāo)boolerrorFlag=0;//錯(cuò)誤標(biāo)志constchar*constKeyWord[MaxKeyWord]={"and","array","begin","case","char""constant","do","else","end","false","for","if","input","integer","not","of","or","output","packed","procedure","program","read","real","repeat","set","then","to","type","until","var","while","with","prn"};//關(guān)鍵字constcharOptA[]={'+','-','*','/','=','#','<','>'};//單目運(yùn)算constchar*OptB[]={"<=",">=",":=","<>"}; //雙目運(yùn)算符constcharEnd[]={'(',')',',',';','.','[',']',':','{','}','"'};//界符voiderror(charstr[20],intnLine,interrorType){ cout<<"\nError:"; switch(errorType) { case1: cout<<"第"<<nLine-1<<"行"<<str<<"變量的長度超過限制!\n"; errorFlag=1; break; case2: cout<<"第"<<nLine-1<<"行"<<str<<"小數(shù)點(diǎn)錯(cuò)誤!\n"; errorFlag=1; break; case3: cout<<"第"<<nLine-1<<"行"<<str<<"常量的長度超過限制!\n"; errorFlag=1; break; } }//errorvoidScanner(charch[],intchLen,Tabletable[Max],intnLine){ intchIndex=0; while(chIndex<chLen)//對(duì)輸入的字符掃描 { while(ch[chIndex]==''||ch[chIndex]==9) {chIndex++;} while(ch[chIndex]==10)//遇到換行符,行數(shù)加1 { nLine++;chIndex++;} if(isalpha(ch[chIndex])) { charstr[256]; intstrLen=0; while(isalpha(ch[chIndex])||ch[chIndex]=='_')//是字母、下劃線 { str[strLen++]=ch[chIndex]; chIndex++; while(isdigit(ch[chIndex]))//不是第一位,可以為數(shù)字 { str[strLen++]=ch[chIndex]; chIndex++; } } str[strLen]=0;//字符串結(jié)束符 if(strlen(str)>20)//標(biāo)識(shí)符超過規(guī)定長度,報(bào)錯(cuò)處理 { error(str,nLine,1); } else{ inti; for(i=0;i<MaxKeyWord;i++) if(strcmp(str,KeyWord[i])==0) { strcpy(table[TableNum].symbol,str); table[TableNum].type=1; table[TableNum].line=nLine; table[TableNum].Index=i; TableNum++; break; } if(i>=MaxKeyWord) { table[TableNum].Index=WordNum; strcpy(Word[WordNum++],str); table[TableNum].type=2;//變量標(biāo)識(shí)符 strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; TableNum++; } } }elseif(isdigit(ch[chIndex])) { intflag=0; charstr[256]; intstrLen=0; while(isdigit(ch[chIndex])||ch[chIndex]=='.') { if(ch[chIndex]=='.') flag++; str[strLen++]=ch[chIndex]; chIndex++; } str[strLen]=0; if(strlen(str)>20) { error(str,nLine,3); } if(flag==0) { table[TableNum].type=3;//整數(shù) } if(flag==1) { table[TableNum].type=4;//小數(shù) } if(flag>1) { error(str,nLine,2); } table[TableNum].Index=DigNum; strcpy(Digit[DigNum++],str); strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; TableNum++; }/*******************************運(yùn)算符************************************/ else { interrorFlag;//用來區(qū)分是不是無法識(shí)別的標(biāo)識(shí)符,0為運(yùn)算符,1為界符 charstr[3]; str[0]=ch[chIndex]; str[1]=ch[chIndex+1]; str[3]=0; for(inti=0;i<MaxOptBNum;i++)//MaxOptBNum) if(strcmp(str,OptB[i])==0) { errorFlag=0; table[TableNum].type=6; strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; table[TableNum].Index=i; TableNum++; chIndex=chIndex+2; break; } if(i>=MaxOptBNum) { for(intk=0;k<MaxOptANum;k++) if(OptA[k]==ch[chIndex]) { errorFlag=0; table[TableNum].type=5; table[TableNum].symbol[0]=ch[chIndex]; table[TableNum].symbol[1]=0; table[TableNum].line=nLine; table[TableNum].Index=k; TableNum++; chIndex++; break; } /*************************界符*****************************************/ for(intj=0;j<MaxEndNum;j++) if(End[j]==ch[chIndex]) { errorFlag=1; table[TableNum].line=nLine; table[TableNum].symbol[0]=ch[chIndex]; table[TableNum].symbol[1]=0; table[TableNum].Index=j; table[TableNum].type=7; TableNum++; chIndex++; }/********************其他無法識(shí)別字符*************************************/ if(errorFlag!=0&&errorFlag!=1)//開頭的不是字母、數(shù)字、運(yùn)算符、界符 { charstr[256]; intstrLen=-1; str[strLen++]=ch[chIndex]; chIndex++; while(*ch!=''||*ch!=9||ch[chIndex]!=10)// { str[strLen++]=ch[chIndex]; chIndex++; } str[strLen]=0; table[TableNum].type=8; strcpy(table[TableNum].symbol,str); table[TableNum].line=nLine; table[TableNum].Index=-2; TableNum++; } } }}}voidTrans(doublex,intp)//把十進(jìn)制小數(shù)轉(zhuǎn)為16進(jìn)制{inti=0;//控制保留的有效位數(shù)while(i<p){if(x==0)//如果小數(shù)部分是0break;//則退出循環(huán)else{intk=int(x*16);//取整數(shù)部分x=x*16-int(k);//得到小數(shù)部分if(k<=9)cout<<k;elsecout<<char(k+55);};i++;};};intmain(){ ifstreamin; ofstreamout,outVar,outCon; charin_file_name[26],out_file_name[26];//讀入文件和寫入文件的名稱 charch[Max];//存放輸入代碼的緩沖區(qū) intnLine=1; //初始化行數(shù)Table*table=newTable[Max]; intchoice; cout<<"請(qǐng)輸入讀入方式:1:從文件中讀,2:從鍵盤讀(輸入結(jié)束標(biāo)志位#):\n"; cin>>choice; switch(choice) { inti;/****************************從文件讀取***************************/ case1: cout<<"Entertheinputfilename:\n"; cin>>in_file_name; in.open(in_file_name); if(in.fail())//打開display表讀文件失敗 { cout<<"Inputputfileopeningfailed.\n"; exit(1); } cout<<"Entertheoutputfilename:\n"; cin>>out_file_name; out.open(out_file_name); outVar.open("變量表.txt"); outCon.open("常量表.txt"); if(out.fail())//打開display表寫文件失敗 { cout<<"Outputfileopeningfailed.\n"; exit(1); } if(outVar.fail())//打開變量表寫文件失敗 { cout<<"VarOutputfileopeningfailed.\n"; exit(1); } if(outCon.fail())//打開常量表寫文件失敗 { cout<<"ConstOutputfileopeningfailed.\n"; exit(1); } in.getline(ch,Max,'#'); Scanner(ch,strlen(ch),table,nLine);//調(diào)用掃描函數(shù) if(errorFlag==1)//出錯(cuò)處理 return0;/*******************************把結(jié)果打印到各個(gè)表中***********************/ out<<"類型"<<" "<<"下標(biāo)"<<endl; for(i=0;i<TableNum;i++)//打印display out<<"(0x"<<hex<<table[i].type<<" , "<<"0x"<<hex<<table[i].Index<<")"<<endl;//在文件testout.txt中輸出 outCon<<"下標(biāo)"<<""<<"常量值"<<endl; for(i=0;i<TableNum;i++)//打印常量表 { if(table[i].type==3) { longnum1; num1=atoi(table[i].symbol); outCon<<"(0x"<<hex<<table[i].Index<<" , "<<"0x"<<hex<<num1<<")"<<endl; } if(table[i].type==4) { doublenum2; num2=atof(table[i].symbol); outCon<<"(0x"<<hex<<table[i].Index<<" , "<<"0x"<<hex<<num2<<")"<<endl; } } outVar<<"類型"<<" "<<"變量名稱"<<endl; for(i=0;i<WordNum;i++)//打印變量表 outVar<<"(0x"<<hex<<i<<" "<<Word[i]<<")"<<endl;//在文件testout.txt中輸出 in.close();//關(guān)閉文件 out.close(); outVar.close(); outCon.close(); break;/***********************************從鍵盤輸入****************************/ case2: cin.getline(ch,Max,'#'); Scanner(ch,strlen(ch),table,nLine);//調(diào)用掃描函數(shù) if(errorFlag==1) return0; cout<<"\nDisplay表:\n"; cout<<"類型"<<" "<<"下標(biāo)"<<endl;//dos界面下 for(i=0;i<TableNum;i++) cout<<"(0x"<<hex<<table[i].type<<" , "<<"0x"<<hex<<table[i].Index<<")"<<endl; cout<<"\n常量表:\n"<<"下標(biāo)"<<""<<"常量值"<<endl; for(i=0;i<TableNum;i++)//打

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論