版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理 實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)類型:單元實(shí)驗(yàn) 基礎(chǔ)實(shí)驗(yàn) / 選做實(shí)驗(yàn)實(shí)驗(yàn)名稱:實(shí)驗(yàn)1.1 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序姓名: _學(xué)號(hào): _班級(jí): _一、原創(chuàng)性聲明參考代碼:參考了兩處代碼,第一部分是關(guān)鍵字的定義,自己想的沒(méi)有這位學(xué)長(zhǎng)寫的全面,所以就直接拿過(guò)來(lái)用了;第二部分是參考學(xué)長(zhǎng)的文件讀寫操作部分。代碼來(lái)源:百度文庫(kù)編譯原理課程設(shè)計(jì)詞法分析器文檔作者是煙大張金榮學(xué)長(zhǎng)。二、實(shí)驗(yàn)要求1. 手工構(gòu)造一個(gè)簡(jiǎn)單的詞法分析程序。 - 能夠識(shí)別標(biāo)識(shí)符、整數(shù)、關(guān)鍵字、算符、界符- 可輸出至文件,也可輸出至屏幕1. 使用緩沖技術(shù)(單緩沖或雙緩沖)2. 詞法分析器作為一個(gè)子程序被語(yǔ)法分析器調(diào)用。± 每次
2、調(diào)用返回一個(gè)單詞± 同時(shí)將單詞及屬性存入符號(hào)表 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序。從以下方法中選一:² 直接轉(zhuǎn)向法² 表驅(qū)動(dòng)法三、完成情況l 功能1 : 基本內(nèi)容² 功能描述: - 能夠識(shí)別標(biāo)識(shí)符、整數(shù)、關(guān)鍵字、算符、界符- 可輸出至文件,也可輸出至屏幕² 完成情況: 基本完成² Bug:能發(fā)現(xiàn)的bug都已修改,² 備注: 標(biāo)識(shí)符、整數(shù)、關(guān)鍵字、算符、界符都是自定義的,并不能識(shí)別所有的標(biāo)識(shí)符、整數(shù)、關(guān)鍵字、算符、界符l 功能2 : 選做內(nèi)容功能描述: 使用緩沖技術(shù)(雙緩沖)根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序:直接轉(zhuǎn)向法
3、178; 完成情況: 基本完成² Bug: 能發(fā)現(xiàn)的bug都已修改,² 備注: 代碼中有幾個(gè)方法是多余的:bool isIdentifier(char *s)/*是否是標(biāo)識(shí)符*/bool isNumber(char *s)/*是否為數(shù)字*/原本是想在main函數(shù)中調(diào)用這兩個(gè)函數(shù),使main函數(shù)結(jié)構(gòu)更加簡(jiǎn)單明了,結(jié)果發(fā)現(xiàn)加不進(jìn)去,會(huì)破壞代碼的邏輯。四、實(shí)現(xiàn)方案狀態(tài)轉(zhuǎn)換圖:五、創(chuàng)新和亮點(diǎn)創(chuàng)新之處:并沒(méi)什么創(chuàng)新之處,亮點(diǎn):用了GOTO語(yǔ)句,使代碼易讀性增強(qiáng)。 底層的操作都在最基本的函數(shù)中,其他函數(shù)再調(diào)用這些函數(shù)來(lái)實(shí)現(xiàn)自己的功能,這些函數(shù)又供其他函數(shù)調(diào)用。使代碼邏輯性,易讀性增強(qiáng)。
4、 Main函數(shù)中不寫多余代碼,調(diào)用其他方法,結(jié)構(gòu)清晰。六、運(yùn)行結(jié)果輸入內(nèi)容:輸出結(jié)果(部分):七、源碼/*/#include <iostream>#include <fstream>#include <string>using namespace std;/*各種變量的定義*/String keywords36 ="char","short","int","unsigned","long","float","double"
5、;,"struct","union","void","enum","const","typedef","auto","static","break","case","continue","default","do","else","for","if","return&q
6、uot;,"switch","while","sizeof","printf","FILE","fopen","NULL","fclose","exit","read","close","fprintf"char delimiters = '', '', '(', ')', ''
7、, '', ''', '"', ',', '', ':'char operators5 = '+','-','*','/','='ifstream infile; /*輸入文件*/ofstream outfile; /*輸出文件*/char buffer1 64;/*緩沖數(shù)組1*/char buffer2 64;/*緩沖數(shù)組2*/char *pointer; /*掃描指針*/*各種函數(shù)的聲明*/bool
8、 isChar(char c);/*是否是字母*/bool isDigit(char c);/*是否是0-9*/bool isUnderline(char c);/*是否是下劃線*/bool isEnter(char c);/*是否是換行*/bool isDelimiter(char c);/*是否是界符*/bool isOperator(char c);/*是否是運(yùn)算符*/int getLength(char *s);/*求一個(gè)字符串的長(zhǎng)度*/bool isIdentifier(char *s);/*是否是標(biāo)識(shí)符*/bool isNumber(char *s);/*是否為數(shù)字*/bool i
9、sKeyword(char *s);/*是否是關(guān)鍵字*/char getChar();/*實(shí)現(xiàn)雙緩沖掃描文件*/void write(string str1,string str2);/*寫入文件,并且在屏幕上打印*/*程序入口:main函數(shù)*/int main() char cc= '0'string str = ""pointer=buffer1; buffer1 63=buffer2 63=-1; /數(shù)組尾數(shù)值為-1infile.open ("in.txt",ios:binary);/二進(jìn)制文件 outfile.open (&quo
10、t;out.txt",ios:trunc);/再次寫入覆蓋文件已有內(nèi)容for (int i=0;i<=62;i+) buffer1 i=infile.get ();/將文件中字符放入第一緩沖區(qū)for (;)str = ""cc = getChar();str += cc;AAA:if (isDelimiter(cc)/*是否是界符*/write("界符",str);else if (isOperator(cc)/*是否是操作符*/write("操作符",str);else if (isEnter(cc)/*是否是換行符
11、*/write("換行", "n");else if (isUnderline(cc) | isChar(cc)/*是否是標(biāo)識(shí)符*/for (;)cc = getChar();if (!(isChar(cc) | isDigit(cc) | isUnderline(cc)write("標(biāo)識(shí)符",str);str = cc;goto AAA;str += cc;else if (isDigit(cc)/*是否是數(shù)字*/for (;)cc = getChar();if (!(isDigit(cc) && cc !=
12、9;.')write("數(shù)字",str);str = cc;goto AAA;str += cc;return 0;/*/*雙緩沖掃描文件*/char getChar()if (*pointer = -1) /*當(dāng)前指針在緩沖區(qū)(不知是那個(gè)緩沖區(qū))末尾*/if (pointer=buffer1+63)/*在第一buffer尾,向第二buffer讀入數(shù)據(jù)*/ for (int i=0;i<=62;i+)buffer2 i=infile.get ();pointer=buffer2;return getChar();else if (pointer=buffer2
13、+63)/*在第二buffer尾,向第一buffer讀入數(shù)據(jù)*/ for (int i=0;i<=62;i+)buffer1 i=infile.get ();pointer=buffer1;return getChar();else/*在不是buffer尾的位置讀到了EOF,說(shuō)明完成了分析*/ infile.close ();outfile.close ();ofstream out;cout<<"nnt詞法分析完畢!"<<endl;system ("pause");exit (-1);return *pointer+;/*
14、是否是字母*/bool isChar(char c)if (c>='a' && c<='z') | (c>='A' && c<='Z') )return true; elsereturn false;/*是否是0-9*/bool isDigit(char c)if (c>='0' && c<='9') return true; elsereturn false;/*是否是下劃線*/bool isUnderline(c
15、har c)if (c = '_')return true; elsereturn false;/*是否是換行*/bool isEnter(char c)if (c = 'n')return true; elsereturn false;/*是否是界符*/bool isDelimiter(char c)for (int i=0;i<10;i+)if (c = delimitersi)return true;return false;/*是否是運(yùn)算符*/bool isOperator(char c)for (int i=0;i<5;i+)if (c =
16、 operatorsi)return true;return false;/*求一個(gè)字符串的長(zhǎng)度*/int getLength(char *s)int len=0;for (int i=0;i+)if (si != '0')len+; elsereturn len;/*是否是標(biāo)識(shí)符*/bool isIdentifier(char *s)int len = getLength(s);if (isChar(s0) | isUnderline(s0)for (int i=1;i<len;i+)if (!(isDigit(si) | isDigit(si) | isUnderli
17、ne(si)return false;return true; elsereturn false;/*是否為數(shù)字*/bool isNumber(char *s)int len = getLength(s);if (s0>=1 && s0<=9)for (int i=0;i<len;i+)if (!isDigit(si) && si!='.')return false;return true; elsereturn false;/*是否是關(guān)鍵字*/bool isKeyword(char *s)for (int i=0;i<keywords->length();i+)if (s = keywordsi)r
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中考物理復(fù)習(xí)專題5間接測(cè)量類實(shí)驗(yàn)課件
- 電機(jī)與電氣控制實(shí)訓(xùn)課程教案
- Photoshop創(chuàng)意合成實(shí)例教案
- 《鯉魚(yú)風(fēng)箏》教案
- 中小學(xué)教務(wù)管理聘用協(xié)議書(shū)
- 幼兒園體弱兒關(guān)懷計(jì)劃
- 教育培訓(xùn)中心箱涵施工合同
- 臨時(shí)銷售電腦租賃合同范本
- 超市賣場(chǎng)租賃續(xù)約協(xié)議
- 礦產(chǎn)資源勘查單位聘用合同模板
- 當(dāng)代世界文化發(fā)展的趨勢(shì)
- 花茶大學(xué)生創(chuàng)新創(chuàng)業(yè)計(jì)劃書(shū)
- 燃燒器調(diào)試報(bào)告
- 《中國(guó)近代經(jīng)濟(jì)史》課件
- 《中國(guó)傳統(tǒng)教育》課件
- 九年級(jí)道德與法治的知識(shí)競(jìng)賽題
- 2024年山東煙臺(tái)財(cái)金集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 胎盤殘留護(hù)理查房課件
- 新媒體視聽(tīng)節(jié)目制作 第九章 鏡頭的組接
- 校醫(yī)務(wù)室托管投標(biāo)方案
- 干成孔旋挖灌注樁施工工藝
評(píng)論
0/150
提交評(píng)論