




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編譯原理實驗(一)——詞法分析器實驗描述運行環(huán)境:vc++2020對某特定語言A,構造其詞法規(guī)那么。該語言的單詞符號包括:2狀態(tài)轉換圖其它3程序流程:詞法分析作成一個子程序,由另一個主程序挪用,每次挪用返回一個單詞對應的二元組,輸出標識符表、常數表由主程序來完成。實驗目的通過動手實踐,使學生對構造編譯系統(tǒng)的大體理論、編譯程序的大體結構有更為深切的明白得和把握;使學生把握編譯程序設計的大體方式和步驟;能夠設計實現編譯系統(tǒng)的重要環(huán)節(jié)。同時增強編寫和調試程序的能力。實驗任務編制程序實現要求的功能,并能完成對測試樣例程序的分析。實驗原理charset[1000],str[500],strtaken[20];//set[]存儲代碼,strtaken[]存儲當前字符charsign[50][10],constant[50][10];//存儲標識符和常量概念了一個Analyzer類classAnalyzer{public:Analyzer();//構造函數~Analyzer();//析構函數intIsLetter(charch);//判定是不是是字母,是那么返回1,不然返回0。intIsDigit(charch);//判定是不是為數字,是那么返回1,不然返回0。voidGetChar(char*ch);//將下一個輸入字符讀到ch中。voidGetBC(char*ch);//檢查ch中的字符是不是為空白,假設是,那么挪用GetChar直至ch進入一個非空白字符。voidConcat(char*strTaken,char*ch);//將ch中的字符連接到strToken以后。intReserve(char*strTaken);//對strTaken中的字符串查找保留字表,假設是一個保留字返回它的數碼,不然返回0。voidRetract(char*ch);//將搜索指針器回調一個字符位置,將ch置為空白字符。voidinput。;//向寄存輸入結果的字符數組輸入一句語句。voiddisplay();//輸出一些程序終止字符顯示樣式intanalyzerSubFun();//詞法分析器子程序,為了實現詞法分析的要緊功能。代碼實現//cifa.cpp:概念操縱臺應用程序的入口點。//#include"stdafx.h#include"stdio.h#include"string.h"#include"iostream"usingnamespacestd;charset[1000],str[500],strtaken[20];//set[]存儲代碼,strtaken[]存儲當前字符charsign[50][10],constant[50][10];//存儲標識符和常量//intWords[500][10];charch;//當前讀入字符intsr,to=0;//數組str,strtaken的指針intst=0,dcount=0;intid=0;staticintline=1;inth,l;typedefstructWords/*放置二元組*/{intnum;charletters[20];}DS;DSWords[500];typedefstructwords{charword[20];inttype;}WORDS;WORDSwords[]={{"program",0},{"not”,1},{"begin”,2},{"end”,3},{"if”,4},{"then”,5},{〃var〃,6},{"else”,7},{"int”,8},{"while”,9},{"and”,10},{"do”,11},{"or”,12},{"+”,15},{"-”,16},{”(",17},{"廣,18},{”,”,19},{";”,20},{”=”,21},{”<”,22},{”>”,23},{”*”,24},{”**”,25},{”>=”,26},{"<=",27},{"!=",28}};typedefstructkeytable/*放置關鍵字*/charname[20];intkind;}KEYTABLE;KEYTABLEkeyword[]={/*設置關鍵字*/{"program”,。},{"not”,1},{"begin”,2},{"end”,3},{"if”,4},{"then",5},{"var",6},{"else”,7},{"int”,8},{"while”,9},{"and”,10},{"do”,11},{"or”,12},};voidopenfile()/*打開文件*/{cout<<""<<endl;cout<<"詞法分析器"<<endl;cout<<""<<endl;cout<<”為結尾的文件作為詞法分析對象,輸入文件名"<<endl;FILE*fp;chara,filename[10];intn=0;gets(filename);if((fp=fopen(filename,"r"))==NULL){printf("cannotopenfile.\n");//exit(0);}elsewhile(!feof(fp))/*文件不終止,那么循環(huán)*/{a=getc(fp);/*getc函數帶回一個字符,賦給a*/set[n]=a;/*文件的每一個字符都放入set口數組中*/n++;}fclose(fp);/*關閉文件*/set[n-1]='\0';}voidreflesh()/*清空strtaken數組*/{to=0;/*全局變量to是strtaken的指示器*/strcpy(strtaken,"");}voidpre1()/*預處置程序*/{inti,a,b,n=0;do{if(set[n]=='/'&&set[n+1]=='*')a=n;/*記錄第一個注釋符的位置*/while(!(set[n]=='*'&&set[n+1]=='/')){if(set[n]=='\n')line++;n++;}b=n+1;/*記錄第二個注釋符的位置*/for(i=a;i<=b;i++)/**/set[i]='';/*把注釋的內容換成空格,等待第二步預處置*/}elseif(set[n]=='/'&&set[n+1]=='/'){a=n;/*記錄第一個注釋符的位置*/while(!set[n]=='\n')n++;b=n+1;/*記錄第二個注釋符的位置*/for(i=a;i<=b;i++)/**/set[i]='';/*把注釋的內容換成空格,等待第二步預處置*/}n++;}while(set[n]!='\0');}voidpre2()/*預處置程序*/{intj=0;sr=0;/*全局變量sr是str[]的指示器*/do{if(set[j]=='||set[j]=='\n'){while(set[j]=='||set[j]=='\n')/*掃描到有持續(xù)的空格或換行符*/{if(set[j]=='\n')line++;j++;}str[sr]='';/*用一個空格代替掃描到的持續(xù)空格和換行符放入str[]*/sr++;}else{str[sr]=set[j];/*假設當前字符不為空格或換行符就直接放入str[]*/sr++;j++;}}while(set[j]!='\0');str[sr]='\0';}charGetChar()/*把字符讀入全局變量ch中,指示器sr前移*/{ch=str[sr];sr++;return(str[sr-1]);}voidGetBC()/*開始讀入符號,直至第一個不為空格*/while(ch==,'){ch=GetChar();}}voidConcat()/*把ch中的字符放入strtaken[]*/{strtaken[to]=ch;to++;/*全局變量to是strtaken的指示器*/strtaken[to]='\0';}intIsLetter()/*判定是不是為字母*/{if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))return(1);elsereturn(0);}intIsDigit()/*判定是不是為數字*/{if(ch>='0'&&ch<='9')return(1);elsereturn(0);}intReserve()/*對strtaken中的字符串查找保留字表,假設是那么返回它的編碼,不然返回一*/{inti,k=0;for(i=0;i<=12;i++){if(stricmp(strtaken,keyword[i].name)==0){k=1;Words[dcount].num=keyword[i].kind;strcpy(Words[dcount].letters,"-");dcount++;return(keyword[i].kind);}}if(k!=1)return(-1);}voidRetract()/*指示器sr回調一個字符位置,把ch置為空*/{sr--;ch=',;}intInsertId(){inti,k;for(i=0;i<id;i++){k=strcmp(strtaken,sign[i]);if(k==0)return(i);
strcpy(sign[id],strtaken);/*插入標識符*/Words[dcount].num=13;strcpy(Words[dcount].letters,strtaken);id++;dcount++;return(id-1);}intInsertConst(){inti,k;for(i=0;i<st;i++){k=strcmp(strtaken,constant[i]);if(k==0)return(i);}strcpy(constant[st],strtaken);/*插入常數*/Words[dcount].num=14;strcpy(Words[dcount].letters,strtaken);st++;dcount++;return(st-1);}voidanalysis(){*/reflesh();/*清空strtaken*/reflesh();/*清空strtaken數組*/pre1();/*預處置,使注釋內容換成單個空格,放回set[]中*/intvalue;pre2();/*預處置,使set[]中持續(xù)的空格置換成單個空格,并把set[]的內容放到str[]中sr=0;/*把字符讀入全局變量/*把字符讀入全局變量ch中,指示器sr前移*/GetBC();/*讀取第一個字符*/while(ch!='\0')/*當不等于終止符,繼續(xù)執(zhí)行*/{if(IsLetter())//標識符和關鍵字判定{while(IsLetter()||IsDigit())/*假設第一個是字符,繼續(xù)讀取,直到顯現空格*/{Concat();GetChar();/*把字符讀入全局變量ch中,指示器sr前移*/}Retract();/*指示器sr回調一個字符位置,把ch置為空*/value=Reserve();/*對strtaken中的字符串查找保留字表,假設是那么返回它的編碼,不然返回一*/if(value==-1)/*若是返回值是一,那確實是標識符,把它輸出*/{InsertId();/*插入標識符*/}reflesh();}elseif(IsDigit()){while(IsDigit())/*不然,假設第一個是數字,繼續(xù)讀取,直到顯現空格*/{Concat();/*把ch中的字符放入strtaken[]*/GetChar();}Retract();/時指示器sr回調一個字符位置,把ch置為空*/InsertConst();/*插入常數,返回類型為int*///printf("%s”,strtaken);//getchar();reflesh();}elseswitch(ch)/*不然,假設是下面的符號*/{case,+':case,-':case'(':case,),:case',':case';':case'=,:case'<,:case,〉,:Concat();for(intc0=15;c0<=23;c0++){if(stricmp(strtaken,words[c0].word)==0){Words[dcount].num=words[c0].type;dcount++;}reflesh();break;default:if(ch==,*,)/*若是是"*"符號,繼續(xù)讀取下一個*/{的情形*/Concat();/*判定是不是為"**"GetChar();if(ch==strtaken[0])Concat();elseRetract();for(intc1=24;c1<=25;c1++){if(stricmp(strtaken,words[c1].word)==0){Words[dcount].num=words[c1].type;dcount++;}}//printf("%s”,strtaken);//getchar();reflesh();break;}elseif(ch=='<'||ch=='>'||ch==,!,){Concat();/*判定是不是為GetChar();if(ch==,=,)Concat();elseRetract();for(intc2=26;c2<=28;c2++){if(stricmp(strtaken,words[c2].word)==0){Words[dcount].num=words[c2].type;dcount++;}的情形*/reflesh();break;}else{h=ch/line;l=ch%line;cout<<"Errorin"<<h<<"行"<<l<<"列”<<endl;//getchar();break;}}GetChar();GetBC();}cout<<"輸出二元組:"<<endl;for(intd_i=0;d_i<dcount;d_i++)cout<<Words[d_i].num<<""<<Words[d_i].letters<<endl;cout<<endl;cout<<"輸出標識符:"<<endl;for(intsign_i=0;sign_i<id;sign_i++)cout<<sign_i<<""<<sign[sign_i]<<endl;cout<<endl;cout<<"輸出常量:"<<endl;for(intconst_i=0;const_i<st;const_i++)cout<<const_i<<""<<constant[const_i]<<endl;cout<<endl;}int_tmain(intargc,_TCHAR*argv[]){openfile();analysi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝設計中的傳統(tǒng)文化融合與創(chuàng)新考核試卷
- 危險廢物處理與環(huán)保產業(yè)市場準入制度考核試卷
- 住宅建筑與社區(qū)居民社區(qū)兒童教育考核試卷
- 勘察項目項目管理海洋工程海洋環(huán)境保護與勘察考核試卷
- 托兒所服務的沉浸式教育與虛擬現實考核試卷
- 托兒所服務的安全管理與緊急救援考核試卷
- 地質勘探設備在地震勘探中的物聯(lián)網應用案例考核試卷
- 微特電機散熱問題解決方案考核試卷
- 鎖匯合同范本
- 外賣小哥租車合同范本
- 新材料概論課件ppt 第8章 新能源材料
- 毛概課說課課件
- 冷庫熱氟融霜操作
- 考生個人簡歷及自述表
- 風電機組偏航誤差產生機理及調整策略研究
- GB/T 18684-2002鋅鉻涂層技術條件
- 第九講:信息與大數據倫理問題-工程倫理
- 四年級美術素養(yǎng)附答案
- 2021年全國中學生天文奧林匹克競賽預賽試題及答案
- 四年級下冊音樂教案-2.2我們美麗的祖國 |接力版
- Quantum軟件培訓手冊
評論
0/150
提交評論