版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、歡迎閱讀實驗報告學(xué)號: 姓名: 專業(yè):計算機科學(xué)與技術(shù)班級:2班 第9周課程 名稱?編譯原理課程設(shè)計實驗課時8實驗 項目手工構(gòu)造Tiny語百的詞法分析器實驗時間7-10 周實驗 目的熟悉Tiny諦言詞法;構(gòu)造DFA;設(shè)計數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu);用 C+實現(xiàn)Tiny 諦言的詞法分析器實驗 環(huán)境?Windows 10 專業(yè)版Microsoft Visual Studio 201311一、Tiny 語言記號Reserved wordsSpecial SymbolsOtherif+then-else*number(1 or more digits)end<repeat=實驗until/內(nèi)容read(
2、 );identifier(1 or more(算write法、1 1.letters)程' |'T - - J-4 -" J'iI "序、步驟二、構(gòu)造Tiny語言和方DFA法)ID : letter(letter)*Number: digit(digit)*三、根據(jù)DFA編寫詞法分析器#include <fstream> #include <string>#include <iostream> using namespacestd;static int rowCounter = 1; 靜態(tài)變量,用于存儲行數(shù)sta
3、tic bool bracketExist = false ;/ 判斷注釋存在與否,false 為不存在 class Lex public :ofstream output;string line =""Lex( string inputLine )line = inputLine ;scan(Trim(line);rowCounter+;string Trim( string & str ) 函數(shù)用于去除每行前后空格 int s = str .find_first_not_of( " t" );int e = str .find_last_no
4、t_of( " t" );str = str .substr(s, e - s + 1);str += "0" return str ;-: nvoid scan( string inputLine )ofstream output;output.open( "SampleOutput.txt" , ios 二app);string line = inputLine ;int i = 0;string str =""int temp;string token =""output <<
5、 rowCounter<<":"<< line << endl; / 輸出每行while (linei !='0' )/根據(jù)DFAm描并判斷if (linei='' ) /注釋bracketExist = true ;if (bracketExist=true )一output << "t" << rowCounter <<while (linei !='')output << linei;/不處理,直接輸出if (line
6、i + 1 != NULLelseoutput << linei<<endl;bracketExist = false ;)if (bracketExist = false )/數(shù)字while (isdigit(linei)temp = temp * 10 + linei;if (!isdigit(linei + 1) j: :二 output << "t" << rowCounter << ": "<< "NUM, val= " << temp&qu
7、ot;"0" << endl;)if (linei + 1 !=NULI&&isdigit(linei + 1)i+;elsebreak;)temp = 0;/符號while (!(isdigit(linei) | (linei >="a" &&linei <="z" ) |(linei >="A" &&linei <="Z" ) | linei =" " | linei ="&qu
8、ot; | linei ="")token = token + linei;if (isdigit(linei + 1) | (linei + 1 >="a" &&linei + 1 <="z")| (linei + 1 >="A" &&linei + 1 <="Z" ) | linei + 1 =" " | linei + 1 ="" |linei + 1 ="" | line
9、i + 1 = NULLif (isToken(token)output << "t" << rowCounter <<": "<< token << endl;elseint j = 0;while (tokenj !="0")(output << "t" << rowCounter << ": "<< tokenj <<endl;j+;)i+;elsebreak;)toke
10、n =""/字母while (linei >="a' &&linei <="z" ) | (linei >="A' &&linei <= . ® J- 1 "Z")(str = str + linei;if (!(linei + 1 >="a" &&linei+ 1 <="z" ) | (linei + 1 >="A" &&l
11、inei + 1 <=Z")(if (isResearvedWord(str) /判斷是否是保留字(output << "t" << rowCounter <<": "<< "Reversed Word:<< str << endl;str << endl;break;) )if (linei + 1 != NULL i+;)str =""if (linei + 1 != NULL (i+; elsebreak;if (lin
12、ei='')output << "t" << rowCounter <<": "<< linei;break;清空,以備下一行讀取line =output << endl; output.close(); bool isResearvedWord( string s)/ 存儲保留字,并判斷 string reservedWord8 = "if" , "then" , "else" , "end", &
13、quot;repeat" , "until" , "read "write" ;bool judge = false ; for ( int i = 0; i < 8; i+) return judge;bool isToken( string s) / 存儲符號,并判斷string token10 = "+" , "-" , "*" , "/" , "=", "<", "(" , &
14、quot;)" , "" , ":=" ;bool judge = false ;for ( int i = 0; i < 10; i+)頁腳內(nèi)容return judge; ;int main()ifstream input;input.open( "SampleInput.tny" )string line50;int i = 0;while (getline(input, linei)/cout << linei << endl;i+;input.close();cout <<
15、endl << endl << "Reading source file completed!" << endl;int j = 0;remove( "SampleOutput.txt");for (j = 0; j < i; j+)Lex lex(linej);cout << endl << endl << "Writing file completed!" << endl << endl << endl;return
16、0;四、重要數(shù)據(jù)結(jié)構(gòu)string line:用于存儲每一行的字符,并逐個讀取分析。string token口:用于存儲TINY語言的符號,并調(diào)用遍歷進(jìn)行判斷。I - :string reservedWord口:用于存儲TINYghf的保留字,遍歷進(jìn)行判斷,若為真,則輸出 Reserved word。static int rowCounter:靜態(tài)變量,存儲行號,每創(chuàng)建一個類的實例便加一。int temp:用于存儲數(shù)字,并輸出。static int bracketExist:靜態(tài)變量,標(biāo)記注釋是否存在。string token, str分別用于臨時存儲讀取的符號的字母用。五、算法總結(jié)建立Lex
17、class ,并讀取每一行,創(chuàng)建Lex的實例,在Lex中處理。先判斷是否在注釋范圍內(nèi),若是,則輸出注釋內(nèi)容,直至產(chǎn)生“”字符。若不在注釋區(qū)內(nèi),則讀取單個字符,根據(jù)DFAS行判斷。若為符號,則當(dāng)下一個字符不是符號 時輸出;若為數(shù)字,則繼續(xù)往下讀,直至下一個字符不是數(shù)字為止,輸出。若為字母,繼續(xù)讀取,直至卜一個字符不是字母,把這一用字母和預(yù)先定義的保留字 比對,若是,則輸出 Reserved word ,若/、是,則輸出 ID, name=子樣。一行處理完畢,便開始創(chuàng)建卜一行實例,直至文件尾。1 X -1 1數(shù)據(jù) 記錄 和計 算Tiny測試程序jr結(jié) 論 (結(jié) 果)1: Sample progra
18、m,j 1."-f,1: Sample program2: in TINY language -2: in TINY language -3: computes factorial3: computes factorial4: 4: 5: read x; input an integer 5:5:5:5:Reversed Word: readID, name= x;input an integer 6: if 0 < x then don't compute if x <= 0 6: Reversed Word: if7: NUM, val= 08: <9: ID, name= x10: Reversed Word: then11: don't compute if x <= 0 7: fact := 1;7: ID, name= fact7:= r-""
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年新型防盜門安裝與安全防范體系合同3篇
- 二零二五年度鋁合金建筑結(jié)構(gòu)優(yōu)化設(shè)計合同4篇
- 二零二五版二手房購房合同定金及房屋裝修合同解除條件協(xié)議書3篇
- 二零二五版科技園區(qū)土地租賃合同示范文本2篇
- 二零二五年度雞苗養(yǎng)殖廢棄資源綜合利用合同范本下載3篇
- 二零二五年度豪華車庫租賃與停車管理合同2篇
- 二零二五年度羅馬柱裝飾設(shè)計與施工一體化合同4篇
- 連鑄機課程設(shè)計
- 二零二五版廠房物業(yè)智慧社區(qū)建設(shè)服務(wù)合同2篇
- 材料力學(xué)課程設(shè)計感想
- 拆除電纜線施工方案
- 搭竹架合同范本
- Neo4j介紹及實現(xiàn)原理
- 銳途管理人員測評試題目的
- 焊接材料-DIN-8555-標(biāo)準(zhǔn)
- 工程索賠真實案例范本
- 重癥醫(yī)學(xué)科運用PDCA循環(huán)降低ICU失禁性皮炎發(fā)生率品管圈QCC持續(xù)質(zhì)量改進(jìn)成果匯報
- 個人股權(quán)證明書
- 醫(yī)院運送工作介紹
- 重癥患者的容量管理
- 學(xué)習(xí)游戲?qū)χ行W(xué)生學(xué)業(yè)成績的影響
評論
0/150
提交評論