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

下載本文檔

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

文檔簡(jiǎn)介

編譯原理實(shí)驗(yàn)-詞法分析器?、實(shí)驗(yàn)?的設(shè)計(jì)、編制、調(diào)試?個(gè)詞法分析程序,對(duì)單詞進(jìn)?識(shí)別和編碼,加深對(duì)詞法分析原理的理解。?、實(shí)驗(yàn)內(nèi)容1.選定語?,編輯任意的源程序保存在?件中;2.對(duì)?件中的代碼預(yù)處理,刪除制表符、回車符、換?符、注釋、多余的空格并將預(yù)處理后的代碼保存在?件中;3.掃描處理后的源程序,分離各個(gè)單詞符號(hào),顯?分離的單詞類型。三、實(shí)驗(yàn)思路對(duì)于實(shí)驗(yàn)內(nèi)容1,選擇編寫c語?的源程序存放在code.txt中,設(shè)計(jì)?個(gè)c語?的詞法分析器,主要包含三部分,?部分是預(yù)處理函數(shù),第?部分是掃描判斷單詞類型的函數(shù),第三部分是主函數(shù),調(diào)?其它函數(shù);對(duì)于實(shí)驗(yàn)內(nèi)容2,主要實(shí)現(xiàn)在預(yù)處理函數(shù)processor()中,使??檔操作函數(shù)打開源程序?件(code.txt),去除兩種類型(“//”,“/*…*/”)的注釋、多余的空格合并為?個(gè)、換?符、回車符等,然后將處理后的保存在另?個(gè)新的?件(afterdel.txt)中,最后關(guān)閉?檔。對(duì)于實(shí)驗(yàn)內(nèi)容3,打開處理后的?件,然后調(diào)?掃描函數(shù),從?件?讀取?個(gè)單詞調(diào)?判斷單詞類型的函數(shù)與之前建?的符號(hào)表進(jìn)?對(duì)?判斷,最后格式化輸出。四、編碼設(shè)計(jì)代碼參考了兩篇博主的,做了部分改動(dòng),添加了預(yù)處理函數(shù)等1#include<iostream>2#include<fstream>3#include<cstdio>4#include<cstring>5#include<string>6#include<cstdlib>78usingnamespacestd;910intaa;//fseek的時(shí)候?來接著的11stringword="";12stringreserved_word[20];//保留//每次讀進(jìn)來的?個(gè)字符0;//每個(gè)單詞中當(dāng)前字符的位置line=1;//?數(shù)row=1;//列數(shù),就是每?的第?個(gè)flag;//?件是否結(jié)束了//單詞的類型13charbuffer;14intnum=15int16int17bool18intflag2;192021//預(yù)處理函數(shù)22intprocessor(){//預(yù)處理函數(shù)23FILE*p;falg0,=len,i=0,j=0;],str1[1000],c;24int25charstr[100026if((p=fopen("code.txt","rt"))==NULL){27printf("?法打開要編譯的源程序");28return0;29}30else{31//fgets(str,1000,p);32while((c=getc(p))!=EOF){33str[i++]=c;34}35fclose(p);36str[i]'\;0'=37for(i=0;i<strlen(str);i++){38if(str[i]==39while'\n'){}40}//單?注釋41elseif(str[i]=='/'&&str[i+1]=='/'){(str[i++]!='/'&&str[i+1]=='*'){(!(str[i]='*'&&str[i+1]=='/')){i++;}42while43i+=2;44}//多?注釋45elseif(str[i]==''&&str[i+1]==''){46while(str[i]==''){i++;}

4748495051525354555657585960616263i--;if(str1[j-1]!='')str1[j++]='';}//多個(gè)空格,去除空格elseif(str[i]=='\n'){if(str1[j-1]!='')str1[j++]='';}//換?處理,elseif(str[i]==9){while(str[i]==9){i++;}if(str1[j-1]!='')str1[j++]='';i--;}//tab鍵處理elsestr1[j++]=str[i];//其他字符處理64}65str1[j]='\0';66if((p=fopen("afterdel.txt","w"))==NULL){6768printf("cannotfindit!");return0;69}70else{71727374if(fputs(str1,p)!=0){printf("預(yù)處理失?。?);}elseprintf("預(yù)處理成功!");75}76fclose(p);77}78return0;79}8081//設(shè)置保留字82voidset_reserve()83{84858687888990919293949596}97reserved_word[1]="return";reserved_word[2]="def";reserved_word[3]="if";reserved_word[4]="else";reserved_word[5]="while";reserved_word[6]="return";reserved_word[7]="char";reserved_word[8]="for";reserved_word[9]="and";reserved_word[10]="or";reserved_word[11]="int";reserved_word[12]="bool";98//看這個(gè)字是不是字母99booljudge_word(charx)100{101if(x>='a'&&x<='z'||x>='A'&&x<='Z'){returntrue;102103}104elsereturnfalse;105}106107//看這個(gè)字是不是數(shù)字108booljudge_number(charx)109{110if(x>='0'&&x<='9'){returntrue;111112}113elsereturnfalse;114}115116//看這個(gè)字符是不是界符117booljudge_jiefu(charx)118{119if(x=='('||x==')'||x==','||x==';'||x=='{'||x=='}'){returntrue;120121}122elsereturnfalse;123}124125126//加減乘127booljudge_yunsuanfu1(charx)128{129130if(x=='+'||x=='-'||x=='*'){

131returntrue;132}133elsereturnfalse;134}135136//等于賦值,?于?于?于等于,?于等于,?于?于137booljudge_yunsuannfu2(charx)138{139if(x=='='||x=='>'||x=='<'||x=='&'||x=='||'){140returntrue;}141142elsereturnfalse;143}144145146//這個(gè)最?的函數(shù)的總體作?是從?件?讀?個(gè)單詞147intscan(FILE*fp)148{149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214buffer=fgetc(fp);//讀取?個(gè)字符if(feof(fp)){//檢測(cè)結(jié)束符flag=0;return0;}elseif(buffer==''){row++;return0;}elseif(buffer=='\n'){row=1;return0;}//如果是字母開頭或'_'看關(guān)鍵字還是普通單詞elseif(judge_word(buffer)||buffer=='_'){word+=buffer;row++;while((buffer=fgetc(fp))&&(judge_word(buffer)||judge_number(buffer)||buffer=='_')){word+=buffer;row++;}if(feof(fp)){flag=0;return1;}for(inti=1;i<=12;i++){if(word==reserved_word[i]){aa=fseek(fp,-1,SEEK_CUR);//如果執(zhí)?成功,stream將指向以fromwhere為基準(zhǔn),偏移offset(指針偏移量)個(gè)字節(jié)的位置,函數(shù)返回0。return3;}}aa=fseek(fp,-1,SEEK_CUR);return1;}//開始是加減乘?定是類型4elseif(judge_yunsuanfu1(buffer)){word+=buffer;row++;return4;}//開始是數(shù)字就?定是數(shù)字elseif(judge_number(buffer)){word+=buffer;row++;while((buffer=fgetc(fp))&&judge_number(buffer)){word+=buffer;row++;}if(feof(fp)){flag=0;return2;}aa=fseek(fp,-1,SEEK_CUR);return2;}//檢驗(yàn)界符elseif(judge_jiefu(buffer))

215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268}269{word+=buffer;row++;return6;}//檢驗(yàn)<=、>=、<>、===、<、>elseif(judge_yunsuannfu2(buffer)){row++;word+=buffer;if(buffer=='<')//為了檢驗(yàn)題?中的<><={buffer=fgetc(fp);if(buffer=='>'||buffer=='='){word+=buffer;row++;return5;}}//檢驗(yàn)>===else{buffer=fgetc(fp);if(buffer=='='){word+=buffer;row++;return5;}}if(feof(fp)){flag=0;}aa=fseek(fp,-1,SEEK_CUR);return4;}//?字符是/有可能是除號(hào)也有可能是注釋elseif(buffer=='/'){row++;word+=buffer;buffer=fgetc(fp);aa=fseek(fp,-1,SEEK_CUR);return4;}else{word+=buffer;row++;return-1;}270intmain()271{272273274275276277278279280281282283284285286287288289290291292293294295296297298set_reserve();//設(shè)置保留字processor();cout<<"open"<<"afterdel.txt"<<endl;flag=1;FILE*fp;if(!(fp=fopen("afterdel.txt","r"))){cout<<"notfoundthefileorothererror"<<endl;flag=0;}while(flag==1){//flag2返回的類型flag2=scan(fp);//反復(fù)調(diào)?函數(shù)提取單詞if(flag2==1){cout<<"type:1identifierif(word.length()>20)"<<word<<endl;cout<<"ERRORIdentifierlengthcannotexceed20characters"<<endl;word.erase(word.begin(),word.end());}elseif(flag2==3){cout<<"type:3reservedword"<<word<<endl;word.erase(word.begin(),word.end());

299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337}}elseif(flag2==4){cout<<"type:4unary_operator"<<word<<endl;word.erase(word.begin(),word.end());}elseif(flag2==2){cout<<"type:2positivenumber"<<word<<endl;//if(word[0]=='0')//cout<<"ERROR:Thefirstdigitcannotbe0!"<<endl;word.erase(word.begin(),word.end());}elseif(flag2==6){cout<<"type:6Separator"<<word<<endl;word.erase(word.begin(),word.end());}elseif(flag2==5){cout<<"type:5double_operator<"<word<<endl;word.erase(word.begin(),word.end());}//?法字符elseif(flag2==-1){cout<<"Illegalcharacter"<<word<<endl;word.erase(word.begin(),word.end());}}inta=fclose(fp);cout<<"pres

溫馨提示

  • 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)論