實(shí)驗(yàn)11 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序_第1頁(yè)
實(shí)驗(yàn)11 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序_第2頁(yè)
實(shí)驗(yàn)11 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序_第3頁(yè)
實(shí)驗(yàn)11 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序_第4頁(yè)
實(shí)驗(yàn)11 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論