版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
詞法解析器計算器設計與實現(xiàn)實驗報告匯總詞法解析器計算器設計與實現(xiàn)實驗報告匯總/詞法解析器計算器設計與實現(xiàn)實驗報告匯總指導教師張靜成績實驗日期實驗時間1實驗名稱:詞法解析器的設計與實現(xiàn)2、實驗目的1)掌握C語言單詞符號的劃分、正規(guī)式、狀態(tài)變換圖及詞法解析器的實現(xiàn)。2)掌握詞法解析程序的作用。3、實驗要求1)對任給的一個C語言源程序,能夠濾掉空格、回車換行符、tab鍵及說明。2)鑒別各樣單詞符號,如要點字、表記符、運算符、常數(shù)、界符,結果以二元式形式輸出,并構造符號表。(3)輸出有詞法錯誤的單詞及所行家號。(在此階段只能鑒別有限的詞法錯誤)4、實驗原理依照掃描到的單詞符號的第一個字符的種類,分別轉到相應的程序進行辦理。這些程序的功能就是鑒別以相應字符開頭的各樣單詞符號。5、實驗步驟(1)依照C語言各樣單詞的正規(guī)式,構造能鑒別各樣單詞的狀態(tài)變換圖。(2)依照狀態(tài)變換圖,構造鑒別各樣單詞的詞法解析器。6、狀態(tài)變換圖及詞法解析程序狀態(tài)變換圖:字母或數(shù)字空白字母非字母與數(shù)字*012數(shù)字非數(shù)字*34運算符*5界符*6其他*7詞法解析程序:#include<stdio.h>#include<stdlib.h>#include<string>#include<iostream>usingnamespacestd;stringkeywords[20]={"include","void","main","int","char","float","double","if","else","then","break","continue","for","do","while","printf","scanf","begin","end","return"};charrz[99999]="";stringid[10000];intpp=0;stringnu[10000];intqq=0;intchoice1(chara)//判斷是否是字母{if((a>='a'&&a<='z')||(a>='A'&&a<='Z'))return1;elsereturn0;}intchoice2(chara)//判斷是否是數(shù)字{if(a>='0'&&a<='9')return1;elsereturn0;}intalpha(intst)//鑒別保留字和表記符{charwordbuf[20]="";intn=0;for(;;){wordbuf[n]=rz[st];st++;n++;if((choice2(rz[st])==1)||(choice1(rz[st])==1)||(rz[st]=='_'))wordbuf[n]=rz[st];elsebreak;}intflag=0;for(intk=0;k<20;k++){if(strcmp(keywords[k].c_str(),wordbuf)==0)flag=1;}if(flag==0){intflagg=-1;for(intt=0;t<pp;t++){if(strcmp(id[t].c_str(),wordbuf)==0){flagg=t;}}if(flagg!=-1)printf("(id,%d)",flagg);else{id[pp]=wordbuf;printf("(id,%d)",pp);pp++;}}else{printf("(");for(inti=0;i<n;i++){printf("%c",wordbuf[i]);}printf(",-)");}returnst;}intnumber(intst)//鑒別整數(shù){charnumbuf[20]="";intn=0;intk=0;intflag=0;for(;;){numbuf[n]=rz[st];st++;n++;if(choice2(rz[st])==1){numbuf[n]=rz[st];}elseif((k==0)&&(rz[st]=='.')){numbuf[n]=rz[st];k++;}elseif(choice1(rz[st])==1){numbuf[n]=rz[st];flag=1;continue;}elsebreak;}if(flag==0){intflagg=-1;for(intt=0;t<qq;t++)if(strcmp(nu[t].c_str(),numbuf)==0)flagg=t;if(flagg!=-1)printf("(nu,%d)",flagg);else{nu[qq]=numbuf;printf("(nu,%d)",qq);qq++;}}else{printf("(");for(inti=0;i<n;i++)printf("%c",numbuf[i]);printf(",errordigital!)");}returnst;}intanotation(intst)//辦理除號/和說明{chartabuf[9999]="";intn=0;st++;if(rz[st]=='/'){printf("(//,-)");st++;while(rz[st]!=10){tabuf[n]=rz[st];st++;n++;}printf("\n說明");for(inti=0;i<n;i++)printf("%c",tabuf[i]);}elseif(rz[st]=='*'){printf("(/*,-)");st++;intstt=st+1;while(1){if(rz[st]=='*'&&rz[st+1]=='/')break;tabuf[n]=rz[st];st++;n++;if(rz[st+1]=='\0'){printf("(/*error!!\n)");returnst+1;}}printf("\n說明");for(inti=0;i<n;i++)printf("%c",tabuf[i]);printf("(*/,-)");st=st+2;}elseif(rz[st]=='='){st++;printf("(/*,-)");}elseprintf("(/,-)");returnst;}intother(intst)//函數(shù)鑒別其他特別字符{switch(rz[st]){case'=':st++;if(rz[st]=='='){st++;printf("(rlop,==)");}elseprintf("(rlop,=)");break;case'+':st++;if(rz[st]=='='){st++;printf("(+=,-)");}elseif(rz[st]=='+'){st++;printf("(++,-)}elseprintf("
");(+,-)
");break;case'-':st++;if(rz[st]=='='){st++;printf("(-=,-)");}elseif(rz[st]=='-'){st++;printf("(--,-)");}elseprintf("(-,-)");break;case'*':st++;if(rz[st]=='='){st++;printf("(*=,-)");}elseprintf("(*,-)");break;case'>':st++;if(rz[st]=='='){st++;printf("(rlop,>=)");}elseprintf("(rlop,>)");break;case'<':st++;if(rz[st]=='='){st++;printf("(rlop,<=)");}elseprintf("(rlop,<)");break;case'%':st++;if(rz[st]=='='){st++;printf("(\%=,-)");}elseprintf("(\%,-)");break;case'!':st++;if(rz[st]=='='){st++;printf("(!=,-)");}elseprintf("(!,wrongthing!)break;case'&':st++;if(rz[st]=='&'){
");st++;printf("(&&,-)");}elseprintf("(&,worngword!)break;case'|':st++;if(rz[st]=='|'){
");st++;printf("(||,-)}elseprintf("break;case'{':st++;printf("({,-)");break;case'}':st++;printf("(},-)");break;case'(':st++;printf("((,-)");break;case')':st++;printf("(),-)");break;case'[':st++;printf("([,-)");break;case']':st++;printf("(],-)");break;case':':st++;printf("(:,-)");break;case'#':st++;
");(|,worngword!)
");printf("(#,-)");break;case';':st++;printf("(;,-)");break;case'.':st++;printf("(.,-)");break;case',':st++;printf("(,,-)");break;case'':st++;break;case'':st++;break;case10:st++;printf("\n");break;case34:st++;printf("(\",-)");break;case39:st++;printf("(',-)");break;default:printf("(%c,worngthing)",rz[st]);st++;}returnst;}intchoice(intst)//依照讀入的單詞的第一個字符確定調(diào)用不同樣的單詞鑒別函數(shù){if(choice1(rz[st])==1)st=alpha(st);elseif(choice2(rz[st])==1)st=number(st);elseif(rz[st]=='/')st=anotation(st);elsest=other(st);returnst;}intmain(){inti=0;FILE*fp;charname[10];printf("請輸入文件名:\n");scanf("%s",&name);if((fp=fopen(name,"r"))==NULL){printf("Openerror!");exit(0);}charch=fgetc(fp);while(ch!=EOF){rz[i]=ch;i++;ch=fgetc(fp);}fclose(fp);intj=0;while(rz[j]!='\0')j=choice(j);cout<<endl<<"程序中標示符以下"<<endl;for(inti=0;i<pp;i++)cout<<i<<""<<id[i]<<endl;cout<<"程序中數(shù)字以下"<<endl;for(intj=0;j<qq;j++)cout<<j<<""<<nu[j]<<endl;system("pause");}7、測試及結果測試代碼:intchoice(intst)//依照讀入的單詞的第一個字符確定調(diào)用不同樣的單詞鑒別函數(shù){if(choice1(rz[st])==1)st=alpha(st);elseif(choice2(rz[st])==1)st=number(st);elseif(rz[st]=='/')st=anotation(st);elsest=other(st);returnst;}測試結果:8、心得經(jīng)過本次的實驗,使我真切的認識詞法解析器的實現(xiàn)過程,讓我更加深故領悟詞法解析器的實現(xiàn)原理。誠然在本次實驗中遇到了各樣各樣的困難和錯誤,但在同學們的幫助下我都一一戰(zhàn)勝了,使得詞法解析器能夠正確的鑒別相應的詞法和表達式。在做實驗的過程中,總是會忽略各樣細節(jié),從而以致經(jīng)常改正一些很小的初級錯誤才能使程序正常運行,不但浪費時間,還影響對其他地方的改正,并且在好多步驟辦理上,方法不正確。使結果不能夠吻合要求,深刻領悟到了自己在編程方面與別人的差距,在今后的學習中,我會注意改正自己在這方面的缺點,促使自己的編程水平不斷進步。編譯原理是一門專業(yè)學科,對于現(xiàn)階段的我來說,只能掌握它的一些基根源理和看法,對于一些更深層的知識還是有好多難以理解的地方。但在此次實驗過程中,鍛煉了自己的思慮能力,也鍛煉了自己的著手編程能力,對于將知識的轉變有了很大的幫助。指導教師張靜成績實驗日期實驗時間1實驗名稱計算器的設計與實現(xiàn)2、實驗目的掌握自上而下語法解析方法、自下而上語法解析方法3、實驗要求實驗內(nèi)容設計及實現(xiàn)計算表達式的計算器。表達式中可包含+、-、*、/、(、)等運算符。實驗要求:對已給的一個二元式形式表達式,能夠檢查有無語法錯誤。并指定出錯地址。將表達式的語法樹輸出(或將語法解析過程輸出)。4、實驗原理依照算符優(yōu)先解析思想實現(xiàn)語法解析程序。5、實驗步驟依照文法構造語法解析表。編寫總控程序實現(xiàn)語法解析。6、算符優(yōu)先解析表及語法解析程序算符優(yōu)先解析表:語法解析程序:#include<stdio.h>#include<stdlib.h>#defineMaxSize99voidtranslate(charstr[],charexp[])/*將算術表達式變換成后綴表達式*/{struct{chardata[MaxSize];inttop;/*top為棧頂*/}op;/*定義一個含data和top的結構體*/charch;inti=0,t=0;op.top=-1;ch=str[i];/*將str的每一個數(shù)變換成ch*/i++;while(ch!='\0')/*ch對應不同樣的符號的時候對應的變換情況*/{switch(ch){case'(':/*當是的時候將此括號存入棧op*/op.top++;op.data[op.top]=ch;break;case')':while(op.data[op.top]!='(')/*括號內(nèi)的變換優(yōu)先級最高故先提取表達式*/{exp[t]=op.data[op.top];op.top--;t++;}op.top--;break;case'+':case'-':while(op.top!=-1&&op.data[op.top]!='('){exp[t]=op.data[op.top];op.top--;t++;}op.top++;/*恢復可插入地址*/op.data[op.top]=ch;break;case'*':case'/':while(op.top=='/'||op.top=='*')/*優(yōu)先級*/{exp[t]=op.data[op.top];op.top--;t++;}op.top++;op.data[op.top]=ch;break;case'':/*忽略空格消除誤操作*/break;default:while(ch>='0'&&ch<='9'){exp[t]=ch;t++;ch=str[i];i++;}i--;exp[t]='#';/*分開操作數(shù)為了美觀也為了今后好分開操作數(shù)*/t++;}ch=str[i];i++;}while(op.top!=-1)/*獲取剩下的部分*/{exp[t]=op.data[op.top];t++;op.top--;}exp[t]='\0';/*表達式結束*/}floatcal_value(charexp[]){struct{floatdata[MaxSize];inttop;}st;/*操作數(shù)棧*/floatd;charch;intt=0;st.top=-1;ch=exp[t];t++;while(ch!='\0'){switch(ch)/*運算主體*/{case'+':st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];st.top--;break;case'-':st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];st.top--;break;case'*':st.data[st.top-1]=st.data[st.top-1]*st.data
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度廣告制作與發(fā)布合同服務內(nèi)容擴展2篇
- 2024滑雪培訓服務合同范本大全
- 家庭教育中的心理輔導與挫折應對策略
- 以愛為引導提升家庭教育中的情感教育效果
- 二零二五年度打架雙方和解協(xié)議書模板(含第三方監(jiān)管機制)2篇
- 二零二五年度二手房交易附贈地下車庫租賃協(xié)議3篇
- 二零二五年度建筑工地職業(yè)健康安全及環(huán)境保護合同3篇
- 二零二五年度押金監(jiān)管下的房屋買賣合同3篇
- 二零二五年度手收割機轉讓及售后服務保障合同3篇
- 二零二五年度大學食堂餐飲管理合同
- 2025年內(nèi)江資中縣融媒體中心招考聘用新媒體工作人員3人高頻重點提升(共500題)附帶答案詳解
- 裝修材料合同范例
- 【7地RJ期末】安徽省合肥市廬江縣2023-2024學年七年級上學期期末地理試題(含解析)
- 共用線路三方協(xié)議合同范例
- 戰(zhàn)略規(guī)劃的關鍵要點
- 社會工作服務質量保障措施
- 雅禮中學2024-2025學年初三創(chuàng)新人才選拔數(shù)學試題及答案
- 冬季高空作業(yè)施工方案
- 山西云時代技術有限公司招聘筆試題目
- 2024-2025學年人教版九年級數(shù)學上學期復習:圓的綜合解答題 壓軸題型專項訓練(30道題)
- 高中學生交通安全課件
評論
0/150
提交評論