S語言詞法分析器設計_第1頁
S語言詞法分析器設計_第2頁
S語言詞法分析器設計_第3頁
S語言詞法分析器設計_第4頁
S語言詞法分析器設計_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗1-4S語言詞法分析器設計PAGEPAGE4實驗1-3S語言詞法分析器設計一、實驗名稱:S語言詞法分析器設計二、實驗目的:通過手工編寫簡化C語言詞法分析器,熟悉并深入理解編譯程序詞法分析器的工作原理。三、實驗內(nèi)容:1.根據(jù)保留字和特殊符號表能區(qū)分出源文件中的保留字、普通標識符和特殊符號,并能進行簡單的錯誤處理。2.設計詞法分析器模塊調(diào)用結(jié)構(gòu)圖和各模塊流程圖。3.程序源代碼。4.程序的執(zhí)行結(jié)果:輸入文件,輸出結(jié)果文件及屏幕信息。四、實驗中出現(xiàn)的問題及解決方法。遇到問題及解決:1、關(guān)于注釋//和除號/。需要區(qū)分,在isanotation函數(shù)中。2、關(guān)于遇到空格時回退,一開始沒有懂,后來經(jīng)過同學講解,明白了如何回退的。3、關(guān)于詞法分析器的思想過程,經(jīng)過老師再三講解,已經(jīng)大致明白,具體步驟,在最后體會部分中。五、程序結(jié)構(gòu)和代碼程序結(jié)構(gòu):代碼:#include<stdio.h>#include<stdlib.h>#include<string>#include<iostream>usingnamespacestd;//關(guān)鍵字表stringkeywords[20]={"include","void","main","int","char","float","double","if","else","then","break","continue","for","do","while","printf","scanf","begin","end","return"};charaa[99999]="";//關(guān)鍵字表初始為空stringid[10000];intpp=0;//常數(shù)表stringnu[10000];intqq=0;//初始化函數(shù)voidinitscanner(){inti=0;FILE*fp;if((fp=fopen("源程序.txt","r"))==NULL)//打開源程序文件{printf("沒有找到此文件!");exit(0);}charch=fgetc(fp);while(ch!=EOF){aa[i]=ch;i++;ch=fgetc(fp);}fclose(fp);}intdecide1(chara)//判斷是否是字母{if((a>='a'&&a<='z')||(a>='A'&&a<='Z'))return1;elsereturn0;}intdecide2(chara)//判斷是否是數(shù)字{if(a>='0'&&a<='9')return1;elsereturn0;}intisalpha(intst)//識別保留字和標識符{charwordbuf[20]="";intn=0;for(;;){wordbuf[n]=aa[st];st++;n++;if((decide2(aa[st])==1)||(decide1(aa[st])==1)||(aa[st]=='_'))wordbuf[n]=aa[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;}intisnumber(intst)//識別數(shù)字{charnumbuf[20]="";intn=0;}elseif(aa[st]=='='){st++;printf("(/*,-)");}elseprintf("(/,-)");returnst;}intisother(intst)//函數(shù)識別其他特殊字符{switch(aa[st]){case'=':st++;if(aa[st]=='='){st++;printf("(rlop,==)");}elseprintf("(rlop,=)");break;case'+':st++;if(aa[st]=='='){st++;printf("(+=,-)");}elseif(aa[st]=='+'){st++;printf("(++,-)");}elseprintf("(+,-)");break;case'-':st++;if(aa[st]=='='){st++;printf("(-=,-)");}elseif(aa[st]=='-'){st++;printf("(--,-)");}elseprintf("(-,-)");break;case'*':st++;if(aa[st]=='='){st++;printf("(*=,-)");}else printf("(*,-)");break;case'>':st++;if(aa[st]=='='){st++;printf("(rlop,>=)");}elseprintf("(rlop,>)");break;case'<':st++;if(aa[st]=='='){st++;printf("(rlop,<=)");}elseprintf("(rlop,<)");break;case'%':st++;if(aa[st]=='='){st++;printf("(\%=,-)");}elseprintf("(\%,-)");break;case'!':st++;if(aa[st]=='='){st++;printf("(!=,-)");}else printf("(!,錯誤!)");break;case'&':st++;if(aa[st]=='&'){st++;printf("(&&,-)");}elseprintf("(&,錯誤)");break;case'|':st++;if(aa[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++;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,錯誤)",aa[st]);st++;}returnst;}intlexscan(intst)//根據(jù)讀入的單詞的第一個字符確定調(diào)用不同的單詞識別函數(shù){if(decide1(aa[st])==1)//如果是字母st=isalpha(st);elseif(decide2(aa[st])==1)//如果是數(shù)字st=isnumber(st);elseif(aa[st]=='/')//如果是標識符或關(guān)鍵字st=isanotation(st);elsest=isother(st);//其他特殊字符returnst;}voidscanner()//若文件未結(jié)束,反復調(diào)用lexscan函數(shù)識別單詞{inti=0;while(aa[i]!=NULL)i=lexscan(i);}voidprint(){cout<<endl;cout<<endl<<"關(guān)鍵字、標示符表如下:"<<endl;cout<<"============================================="<<endl;for(inti=0;i<pp;i++)cout<<i<<""<<id[i]<<endl;cout<<"============================================="<<endl;cout<<endl;cout<<"常數(shù)表如下:"<<endl;cout<<"============================================="<<endl;for(intj=0;j<qq;j++)cout<<j<<"

溫馨提示

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

評論

0/150

提交評論