




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、編譯原理 實驗報告實驗類型:單元實驗 基礎(chǔ)實驗 / 選做實驗實驗名稱:實驗1.1 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序姓名: _學號: _班級: _一、原創(chuàng)性聲明參考代碼:參考了兩處代碼,第一部分是關(guān)鍵字的定義,自己想的沒有這位學長寫的全面,所以就直接拿過來用了;第二部分是參考學長的文件讀寫操作部分。代碼來源:百度文庫編譯原理課程設(shè)計詞法分析器文檔作者是煙大張金榮學長。二、實驗要求1. 手工構(gòu)造一個簡單的詞法分析程序。 - 能夠識別標識符、整數(shù)、關(guān)鍵字、算符、界符- 可輸出至文件,也可輸出至屏幕1. 使用緩沖技術(shù)(單緩沖或雙緩沖)2. 詞法分析器作為一個子程序被語法分析器調(diào)用。± 每次
2、調(diào)用返回一個單詞± 同時將單詞及屬性存入符號表 根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序。從以下方法中選一:² 直接轉(zhuǎn)向法² 表驅(qū)動法三、完成情況l 功能1 : 基本內(nèi)容² 功能描述: - 能夠識別標識符、整數(shù)、關(guān)鍵字、算符、界符- 可輸出至文件,也可輸出至屏幕² 完成情況: 基本完成² Bug:能發(fā)現(xiàn)的bug都已修改,² 備注: 標識符、整數(shù)、關(guān)鍵字、算符、界符都是自定義的,并不能識別所有的標識符、整數(shù)、關(guān)鍵字、算符、界符l 功能2 : 選做內(nèi)容功能描述: 使用緩沖技術(shù)(雙緩沖)根據(jù)狀態(tài)轉(zhuǎn)換圖手工構(gòu)造詞法分析程序:直接轉(zhuǎn)向法
3、178; 完成情況: 基本完成² Bug: 能發(fā)現(xiàn)的bug都已修改,² 備注: 代碼中有幾個方法是多余的:bool isIdentifier(char *s)/*是否是標識符*/bool isNumber(char *s)/*是否為數(shù)字*/原本是想在main函數(shù)中調(diào)用這兩個函數(shù),使main函數(shù)結(jié)構(gòu)更加簡單明了,結(jié)果發(fā)現(xiàn)加不進去,會破壞代碼的邏輯。四、實現(xiàn)方案狀態(tài)轉(zhuǎn)換圖:五、創(chuàng)新和亮點創(chuàng)新之處:并沒什么創(chuàng)新之處,亮點:用了GOTO語句,使代碼易讀性增強。 底層的操作都在最基本的函數(shù)中,其他函數(shù)再調(diào)用這些函數(shù)來實現(xiàn)自己的功能,這些函數(shù)又供其他函數(shù)調(diào)用。使代碼邏輯性,易讀性增強。
4、 Main函數(shù)中不寫多余代碼,調(diào)用其他方法,結(jié)構(gòu)清晰。六、運行結(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);/*是否是運算符*/int getLength(char *s);/*求一個字符串的長度*/bool isIdentifier(char *s);/*是否是標識符*/bool isNumber(char *s);/*是否為數(shù)字*/bool i
9、sKeyword(char *s);/*是否是關(guān)鍵字*/char getChar();/*實現(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);/二進制文件 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)/*是否是標識符*/for (;)cc = getChar();if (!(isChar(cc) | isDigit(cc) | isUnderline(cc)write("標識符",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) /*當前指針在緩沖區(qū)(不知是那個緩沖區(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,說明完成了分析*/ 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;/*是否是運算符*/bool isOperator(char c)for (int i=0;i<5;i+)if (c =
16、 operatorsi)return true;return false;/*求一個字符串的長度*/int getLength(char *s)int len=0;for (int i=0;i+)if (si != '0')len+; elsereturn len;/*是否是標識符*/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. 本站所有資源如無特殊說明,都需要本地電腦安裝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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度酒店客房翻新裝修承包合同
- 2025年度廚師餐飲項目合伙人聘用合同范例
- 2025年離婚協(xié)議中共同債務(wù)分擔及清償協(xié)議范本
- 2025年度離婚協(xié)議書中子女心理健康關(guān)懷與輔導協(xié)議
- 2025年度城市綜合體房地產(chǎn)開發(fā)建設(shè)工程合同
- 制定客戶忠誠計劃的月度工作計劃
- 住院患者權(quán)益維護措施計劃
- 國際貿(mào)易的市場分析與預測計劃
- 應(yīng)對突發(fā)事件的生產(chǎn)計劃調(diào)整
- 秋季學期學業(yè)輔導計劃
- 西安2025年陜西西安音樂學院專任教師招聘20人筆試歷年參考題庫附帶答案詳解
- 廣西壯族自治區(qū)北海市2024-2025學年九年級上學期1月期末化學試題(含答案)
- 2025年浙江紹興杭紹臨空示范區(qū)開發(fā)集團有限公司招聘筆試參考題庫附帶答案詳解
- 煤礦隱蔽致災因素普查
- 2024年殯儀館建設(shè)項目可行性研究報告(編制大綱)
- 2025年春新冀教版英語三年級下冊課件 U1L1
- DBJ33T 1271-2022 建筑施工高處作業(yè)吊籃安全技術(shù)規(guī)程
- 基本藥物制度政策培訓課件
- 2025年3月日歷表(含農(nóng)歷-周數(shù)-方便記事備忘)
- 《中國人口老齡化》課件
- 腰椎后路減壓手術(shù)
評論
0/150
提交評論