Tiny語言的詞法分析器-C++版-課程設(shè)計報告_第1頁
Tiny語言的詞法分析器-C++版-課程設(shè)計報告_第2頁
Tiny語言的詞法分析器-C++版-課程設(shè)計報告_第3頁
Tiny語言的詞法分析器-C++版-課程設(shè)計報告_第4頁
Tiny語言的詞法分析器-C++版-課程設(shè)計報告_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論