![編譯原理實驗報告696_第1頁](http://file4.renrendoc.com/view/2c79b871cd06c92d2d46dbae7fd85c75/2c79b871cd06c92d2d46dbae7fd85c751.gif)
![編譯原理實驗報告696_第2頁](http://file4.renrendoc.com/view/2c79b871cd06c92d2d46dbae7fd85c75/2c79b871cd06c92d2d46dbae7fd85c752.gif)
![編譯原理實驗報告696_第3頁](http://file4.renrendoc.com/view/2c79b871cd06c92d2d46dbae7fd85c75/2c79b871cd06c92d2d46dbae7fd85c753.gif)
![編譯原理實驗報告696_第4頁](http://file4.renrendoc.com/view/2c79b871cd06c92d2d46dbae7fd85c75/2c79b871cd06c92d2d46dbae7fd85c754.gif)
![編譯原理實驗報告696_第5頁](http://file4.renrendoc.com/view/2c79b871cd06c92d2d46dbae7fd85c75/2c79b871cd06c92d2d46dbae7fd85c755.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編譯方法實驗報告實驗1:掃描器的設計一、實驗目的熟悉并實現(xiàn)一個掃描器(詞法分析程序)。二、實驗要求(1)設計掃描器的有限自動機(識別器);(2)設計翻譯、生成Token的算法(翻譯器);(3)編寫代碼并上機調試運行通過?!ぽ斎搿闯绦蛭募蛟闯绦蜃址?;·輸出——相應的Token序列;關鍵字表和界符表;符號表和常數(shù)表;三、實驗步驟流程:初始化;打開用戶源程序文件;while(文件未結束){讀入一行到w[i],i=0;do//處理一行,每次處理一個單詞{濾空格,直到第一個非空的w[i];i--;s=1;//處理一個單詞開始while(s!=0)//拼單詞并生成相應Token{act(s);if(s>=11&&s<=14)break;//執(zhí)行q//一個單詞處理結束si++;//getchar()s=find(s,w[i]);}if(s==0)詞法錯誤;}while(w[i]!=換行符);}關閉用戶源程序文件;生成Token文件;輸出關鍵字表;輸出Token序列;輸出符號表;輸出常數(shù)表;有限自動機的狀態(tài)轉換圖:eddd+|--1/+/-+①d②.③d④e⑤⑥d⑦11d--1/+/-l/d-1/+/-12-1-1l⑧--113b⑨b⑩-14--115-其中:d為數(shù)字,l為字母,b為界符,-1代表其它符號(如在狀態(tài)8處遇到了非字母或數(shù)字的其它符號,會變換到狀態(tài)12)。關鍵字表和界符表:ProgramBeginEnd;:(Var)WhileDoRepeatUntilFor,:=+-*To/IfThenElse>>===<<=四、主要數(shù)據(jù)結構①狀態(tài)轉換矩陣:intaut[10][7]={2,0,0,0,8,9,15,2,3,5,11,0,0,11,4,0,0,0,0,0,0,4,0,5,11,0,0,11,7,0,0,6,0,0,0,7,0,0,0,0,0,0,7,0,0,11,0,0,11,8,0,0,0,8,0,12,0,0,0,0,0,10,14,0,0,0,0,0,0,13};②關鍵字表:charkeywords[30][12]={“program”,”begin”,”end”,”var”,”while”,”do”,”repeat”,”until”,”for”,”to”,”if”,”then”,”else”,“;”,”:”,”(“,”)”,”,”,”:=”,”+”,”-“,”*”,”/”,”>”,”>=”,”==”,“<”,“<=”};③符號表:charID[50][12];④常數(shù)表:floatC[20];//表中存有源程序中的標識符⑤其它變量:structtoken{intcode;intvalue};structtokentok[100];ints;//Token結構//Token數(shù)組//當前狀態(tài)intn,p,m,e,t;floatnum;charw[50];inti;//尾數(shù)值,指數(shù)值,小數(shù)位數(shù),指數(shù)符號,類型//常數(shù)值//源程序緩沖區(qū)//源程序指針,當前字符為w[i]charstrTOKEN[12];//當前已經(jīng)識別出的單詞五、實驗核心代碼intmain(intargc,char*argv[]){FILE*fp;ints;當前狀態(tài)有限自*動機中的狀態(tài)//fp=fopen("exa.txt","r");while(!feof(fp)){fgets(w,50,fp);i=0;//*處理一行do{printf("%c",w[i]);測試顯示每個tok的e首n字母////*處理一個tokenwhile(w[i]=='')濾空格i++;if(w[i]>='a'&&w[i]<='z')//判定單詞類別*是字母(關鍵字或標識符){ptr=col2;num_map=2;}else//*是數(shù)字(常量的開頭){if(w[i]>='0'&&w[i]<='9'ptr=col1;num_map=4;}elseif//*其他字符算為非法字符(strchr(col3[0].str,{printf("非法字符%c\n",w[i]);i++;continue;}else//界符{ptr=col3;num_map=1;}i--;向后退一個字符開始處理一個單詞s=1;while(s!=0){act(s);if(s>=11&&s<=14)判斷是否是終止狀態(tài)是*終止狀態(tài),則形成一個tokenbreak;i++;讀取下一個字符s=find(s,w[i]);狀態(tài)轉換}if(s==0){strTOKEN[i_str]='\0';printf("詞法錯誤:%s\n",strTOKEN);}}while(w[i]!=10);}printf(關鍵字表:");輸出結果//for(i=0;i<30;i++)printf("%s",keywords[i]);printf("\n");printf("Token序列:");for(i=0;i<num_token;i++)printf("(%d,%d)",tok[i].code,tok[i].valueprintf("\n");printf("符號表:");for(i=0;i<num_ID;i++)printf("%s",ID[i]);printf("\n");printf("常數(shù)表:");for(i=0;i<num_C;i++)printf("%d",C[i]);printf("\n");fclose(fp);printf("HelloWorld!\n");return0;}//*狀態(tài)轉換后,達到新的狀態(tài)之后,記錄的變化voidact(ints){intcode;switch(s){case1:n=0;m=0;p=0;t=0;e=1;num=0;i_str=0;strTOKEN[i_str]='\0';其它變量初始化break;case2:n=10*n+w[i]-48;break;case3:t=1;break;case4:n=10*n+w[i]-48;m++;break;case5:t=1;break;case6:if(w[i]=='-')e=-1;break;case7:p=10*p+w[i]-48;break;case8:strTOKEN[i_str++]=w[i];將ch中的符號拼接到strTO的K尾E部N//;break;case9:strTOKEN[i_str++]=w[i];將ch中的符號拼接到strTO的K尾E部N//;break;case10:strTOKEN[i_str++]=w[i];將ch中的符號拼接到strTO的K//尾EN部;break;case11:num=n*pow(10,e*p-m);計算常數(shù)值//tok[i_token].code=2;tok[i_token+生成常數(shù)Tokennum_token++;break;case12:strTOKEN[i_str]='\0';code=Reserve(strTOKEN);查關鍵字表if(code)t{ok[i_token].code=code;}tok[i_token++]生成//關鍵字Tokenelse{tok[i_token].code=1;tok[i_token++].value=InsertID(strTOKEN)生成標識符Tokennum_token++;break;case13:strTOKEN[i_str]='\0';code=Reserve(strTOKEN);查界符表if(code){tok[i_token].code=code;生成界tok[i_tok符Tokenelse{strTOKEN[strlen(strTOKEN)-1]=單界符i--;code=Reserve(strTOKEN);查界符表tok[i_token].code=code;生成界符Toktok[ien}num_token++;break;case14:strTOKEN[i_str]='\0';code=Reserve(strTOKEN);查界符表tok[i_token].code=code;生成界符tok[i_toTokennum_token++;break;}}//*狀態(tài)轉換intfind(ints,charch){inti,col=7;structmap*p;p=ptr;for(i=0;i<num_map;i++)if(strchr((p+i)->str,ch)){col=(p+i)->col;break;}returnaut[s][col];}//*向常量表中插入常量intInsertConst(doublenum){inti;for(i=0;i<num_C;i++)if(num==C[i])returni;C[i]=(int)num;num_C++;returni;}intReserve(char*str){inti;for(i=0;i<num_key;i++)if(!strcmp(keywords[i],str))return(i+3);return0;}//*向符號表中插入新的符號intInsertID(char*str){inti;for(i=0;i<num_ID;i++)if(!strcmp(ID[i],str))符號已經(jīng)存在,則返回地址//returni;strcpy(ID[i],str);num_ID++;returni;}六、實驗結果實驗思考題:1.掃描器的任務是什么?答:詞法分析程序又稱掃描器,任務有:(1)識別單詞——從用戶的源程序中把單詞分離出來;(2)翻譯單詞——把單詞轉換成機內表示,便于后續(xù)處理。2.掃描器、識別器、翻譯器三者之間的關系是怎樣的?答:掃描器、識別器、翻譯器三者之間的關系是:掃描器的實現(xiàn)要通過識別器和翻譯器1.為什么說有限自動機是詞法分析的基礎?答:因為詞法分析的包括:識別---識別單詞的有限自動機。和翻譯---根據(jù)有限自動機所識別出的對象,完成從單詞串到單詞的TOKEN串的翻譯。我們可以看出,不論是識別還是分析,都是應用有限自動機,所以可以說有限自動機是詞法分析的基礎。實驗2:中間代碼生成器的設計一、實驗目的熟悉算術表達式的語法分析與中間代碼生成原理。二、實驗要求(1)設計語法制導翻譯生成表達式的四元式的算法;(2)編寫代碼并上機調試運行通過。·輸入——算術表達式·輸出——語法分析結果相應的四元式序列(3)本實驗已給出遞歸子程序法的四元式屬性翻譯文法的設計,鼓勵學生在此基礎上進行創(chuàng)新,即設計LL(1)分析法或LR(0)分析法的屬性翻譯文法,并根據(jù)這些屬性翻譯文法,使用擴展的語法分析器實現(xiàn)語法制導翻譯。三、設計概要(1)算術表達式文法G(E):EEω0T|TTTω1F|FFi|(E)(2)文法變換G’(E)ET{ωT}TF{ω1F}Fi|(E)0(3)屬性翻譯文法:ET{ω“push(SYN,w)”T“QUAT”}0TF{ω“push(SYN,w)”F“QUAT”}1Fi“push(SEM,entry(w))”|(E)其中:·push(SYN,w)—當前單詞w入算符棧SYN;·push(SEM,entry(w))—當前·QUAT—生成四元式函數(shù)i.T=newtemp;w在符號表中的入口值壓入語義棧SEM;ii.QT[j]=(SYN[k],SEM[s-1],SEM[s],T);j++;iii.pop(SYN,_);pop(SEM,_);pop(SEM,_);push(SEM,T);(4)遞歸下降子程序:·數(shù)據(jù)結構:SYN—算符棧;SEM—語義棧;E:T:入口入口TFnω0?nω1?yy出口push(SYN,w)出口push(SYN,w)read(w)QUATread(w)TQUATi?FF:主程序:ZE入口(?nnerrread(w)read(w)push(SEM,entry(w))EEerrn#?errn)?yy輸出四元式序列read(w)結束出口四、實驗核心代碼voidmain()//主函數(shù){t=1;cout<<"輸入表達式,以#結束:"<<endl;Z();}stringits(inta){stringd;//整形變成字符串形函數(shù)charb='0',c;inti;while(a!=0){i=a%10;a=a/10;c=(int)b+i;d=c+d;}returnd;}charF(charw){stringtheWord;//F自動機if(w>='a'&&w<='z'||w>='A'&&w<='Z'){theWord=w;//當前字符是字母markStack.push(theWord);//則壓棧}elseif(w=='('){cin>>w;//是左括號//則讀取下一字符w=E(w);if(w!=')'){//不是右括號則輸入有誤,報錯cerr<<"輸入錯誤!"<<endl;exit(0);}}else{//否則有誤,報錯cerr<<"輸入錯誤!"<<endl;exit(0);}cin>>w;//讀取下一字符returnw;}charE(charw){stringoperate,a,b,c;//E自動機stringstate[5];w=T(w);while(w=='+'||w=='-'){operate=w;//是加或減符號cin>>w;//讀入下一字符w=T(w);b=markStack.pop();a=markStack.pop();//字符棧彈出//兩個操作字符cout<<"(\""<<operate<<"\","<<a<<","<<b<<",t"<<t<<")"<<endl;c="t"+its(t);markStack.push(c);t++;//輸出四元式//新狀態(tài)壓棧//狀態(tài)計數(shù)加一}returnw;}charT(charw){stringoperate,a,b,c;stringstate[5];w=F(w);while(w=='*'||w=='/'){operate=w;cin>>w;//讀取下一字符w=F(w);b=markStack.pop();a=markStack.pop();//符號棧彈出//兩個操作字符cout<<"(\""<<operate<<"\","<<a<<","<<b<<",t"<<t<<")"<<endl;c="t"+its(t);markStack.push(c);t++;}returnw;}boolZ(){charw;//Z自動機cin>>w;w=E(w);if(w=='#'){//遇到"#"則結束returntrue;}else{returnfalse;}}五、實驗結果實驗思考題:1.語法分析分為幾類?其關鍵技術各是什么?答:自頂向下法(推導法)從開始符號出發(fā),采用推導運算,試圖自頂向下構造語法樹。自底向上法(歸約法)從給定的符號串出發(fā),采用歸約運算,試圖自底向上構造語法樹。2.什么是遞歸下降子程序法,什么是LL(1)分析法?二者對文法各有什么要求?答:遞歸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 9 What's your hobby 說課稿(說課稿)-2024-2025學年湘少版(三起)英語五年級上冊
- Unit 3 What Would you like(說課稿)-2024-2025學年人教PEP版英語五年級上冊
- 2023九年級數(shù)學上冊 第六章 反比例函數(shù)1 反比例函數(shù)說課稿 (新版)北師大版
- 10《爬山虎的腳》說課稿-2024-2025學年語文四年級上冊統(tǒng)編版
- 2023三年級英語下冊 Unit 2 Animals at the Zoo Lesson 8 Tigers and Bears說課稿 冀教版(三起)
- 2025民間個人借款合同書范文
- 2024-2025學年高一歷史第13周 6.2卓爾不群的雅典說課稿
- 2025常年法律顧問合同
- 19《一只窩囊的大老虎》第二課時(說課稿)-2024-2025學年統(tǒng)編版語文四年級上冊001
- 2025獨家經(jīng)銷合同范本
- GMS要素-持續(xù)改進(CI)-上汽通用五菱-課件
- 《插畫設計》課程標準
- 九九乘法口訣表(超清晰打印版)
- 高考作文答題卡(作文)
- 在鄉(xiāng)村治理中深化推廣運用清單制、積分制、一張圖工作方案
- GB/T 3921-2008紡織品色牢度試驗耐皂洗色牢度
- 營養(yǎng)學基礎知識-課件
- 梅毒的診斷與治療課件
- 工程倫理第二講工程中的風險、安全與責任課件
- 高中數(shù)學《橢圓》方程典型例題20例(含標準答案)
- 中山大學孫逸仙紀念醫(yī)院醫(yī)用耗材試用登記表【模板】
評論
0/150
提交評論