實驗1實驗報告_第1頁
實驗1實驗報告_第2頁
實驗1實驗報告_第3頁
實驗1實驗報告_第4頁
實驗1實驗報告_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗一 詞法分析班級:計科12-3 學號:08123282 姓名:樊鑫一 實驗目的1、 學會針對DFA轉換圖實現相應的高級語言源程序。2、 深刻領會狀態轉換圖的含義,逐步理解有限自動機。3、 掌握手工生成詞法分析器的方法,了解詞法分析器的內部工作原理。二 實驗內容TINY計算機語言的編譯程序的詞法分析部分實現。從左到右掃描每行該語言源程序的符號,拼成單詞,換成統一的內部表示(token)送給語法分析程序。為了簡化程序的編寫,有具體的要求如下:(1) 數僅僅是整數。(2) 空白符僅僅是空格、回車符、制表符。(3) 代碼是自由格式。(4) 注釋應放在花括號之內,并且不允許嵌套三 實驗要求要求實現編

2、譯器的以下功能:(1) 按規則拼單詞,并轉換成二元式形式(2) 刪除注釋行(3) 刪除空白符 (空格、回車符、制表符)(4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行號,并且打印出每行包含的記號的二元形式(5) 發現并定位錯誤,詞法分析進行具體的要求:(1) 記號的二元式形式中種類采用枚舉方法定義;其中保留字和特殊字符是每個都一個種類,標示符自己是一類,數字是一類;單詞的屬性就是表示的字符串值。(2) 詞法分析的具體功能實現是一個函數GetToken(),每次調用都對剩余的字符串分析得到一個單詞或記號識別其種類,收集該記號的符號串屬性,當識別一個單詞完畢,采用返回值的形式返回符號

3、的種類,同時采用程序變量的形式提供當前識別出記號的屬性值。這樣配合語法分析程序的分析需要的記號及其屬性,生成一個語法樹。(3) 標示符和保留字的詞法構成相同,為了更好的實現,把語言的保留字建立一個表格存儲,這樣可以把保留字的識別放在標示符之后,用識別出的標示符對比該表格,如果存在該表格中則是保留字,否則是一般標示符。四 實驗程序#include <iostream>#include <iomanip>#include <ctype.h>#include <fstream>#include <string>using namespace

4、 std;enum WordType WRONG, NUMBER, BIAOSHI, IF, THEN, ELSE, END, REPEAT, UNTIL, /9READ, WRITE, PLUS, SUBTRACT, MULTIPLY, DIVIDEY, EQUAL, LESSTHAN, COLON,/18ASSIGNMENT, LINE_FEED, SPACE, TAB, BRACKET_L, BRACKET_R; /24enum CharType ALPHABET, OTHER;enum WrongType ZERO, ALP_NUM, NUM_ALP, UNLEAGL_S, NO_MA

5、TCH, UNKNOW;char *Words = "wrong", "number", "biaoshi", "if", "then", "else", "end", "repeat", "until", /9"read", "write", "+", "-", "*", "/", "=

6、", "<", ":",/18":=", "n", " ", "", "", "" /24typedef structchar *str;int wordtype;Two;char ArrayChar100, cbuffer;int i=-1, numline = 1, wordtype;string LineChar;Two T;ifstream fp("source.txt",ios:in);in

7、t main ()void HandleAlphabet();void HandleNumber ();void HandleOther ();if (!fp)cout<<"文件打開錯誤!"<<endl;elsecout << setiosflags (ios:left) << setw (6) << "行數" << "("cout << setiosflags (ios:left) << setw (10)<< "類

8、別編碼" << ","cout << setiosflags (ios:left) << setw (20) << "字符" << ")" << endl;fp.get (cbuffer);while (!fp.eof ()if(cbuffer = 'n')/忽略換行符cout << "第" << numline << " 行所有字符:" << Lin

9、eChar << endl;numline+;LineChar = ""fp.get(cbuffer);else if (cbuffer = ' ')/忽略空字符LineChar += " "fp.get(cbuffer);else if (cbuffer = '')/忽略制表符LineChar += ""fp.get(cbuffer);else if (isalpha(cbuffer)/判斷是否是字母HandleAlphabet ();else if (isdigit(cbuffer)/判

10、斷是否是數字HandleNumber ();else /其他字符HandleOther ();i = -1;cout << "第" << numline << " 行所有字符:" << LineChar << endl;fp.close ();system ("pause");return 0;int Match(char str, int chartype)/查找匹配的字符int i;switch (chartype)case ALPHABET:for (i = IF; i

11、 <= WRITE; i+)if (strcmp(Wordsi,str) = 0)return i;case OTHER:for (i = PLUS; i <= ASSIGNMENT; i+)if (strcmp(Wordsi,str) = 0)return i;returnWRONG;void TypeWrong (int wrongtype, int line)switch (wrongtype)case ZERO:break;case ALP_NUM:cout << "字母后面不能緊跟數字!"break;case NUM_ALP:cout &l

12、t;< "數字后面不能緊跟字母!"case UNLEAGL_S:break;cout << "非法特殊符號!"break;case NO_MATCH:cout << "沒有與第" << line << "行""匹配的""!" break;default:cout << "其它類型錯誤!"break;Two ConvertTwo (char str, int wordtype, int wro

13、ngtype, int numline, int line)/進行二元轉換Two T;T.wordtype = wordtype;T.str = str;cout << setiosflags (ios:left) << setw (6) << numline << "("cout << setiosflags (ios:left) << setw (10)<< T.wordtype << ", "cout << setiosflags (ios:

14、left) << setw (20) << T.str << ")"if (T.wordtype = WRONG)TypeWrong (wrongtype, line);cout << endl;return T;void HandleAlphabet ()/首字符為字母時的處理bool mark = true;while(!fp.eof() && isalpha(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);if (isdigit (cbuffer)mark = fa

15、lse;while(!fp.eof() && (isalpha(cbuffer)|isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);ArrayChari+1='0'LineChar += ArrayChar;if (mark)wordtype = Match(ArrayChar, ALPHABET);T = ConvertTwo(ArrayChar,(BIAOSHI > wordtype ? BIAOSHI : wordtype), ZERO, numline, numline);elseT = Con

16、vertTwo(ArrayChar,WRONG, ALP_NUM, numline, numline);void HandleNumber ()/首字符為數字時的處理bool mark = true;while (!fp.eof() && isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get(cbuffer);if (isalpha(cbuffer)mark = false;while(!fp.eof() && (isalpha(cbuffer)|isdigit(cbuffer)ArrayChar+i=cbuffer;fp.get

17、(cbuffer);ArrayChari+1='0'LineChar += ArrayChar;if (mark)T = ConvertTwo(ArrayChar, NUMBER, ZERO, numline, numline);elseT = ConvertTwo(ArrayChar,WRONG, NUM_ALP, numline, numline);void DeleteNote ()/刪除注釋int record = numline;while (!fp.eof() && cbuffer != '')fp.get(cbuffer);whil

18、e (!fp.eof() && cbuffer != '')if (cbuffer = 'n')ArrayChar i + 1 = '0'LineChar += ArrayChar;cout << "第" << numline << " 行所有字符:" << LineChar << endl;LineChar = ""numline+;i = -1;fp.get(cbuffer);ArrayChar+i=cbuf

19、fer;fp.get(cbuffer);ArrayChari + 1='0'if (cbuffer = '')ArrayChar +i = ''ArrayChari + 1='0'T = ConvertTwo("",BRACKET_R, ZERO, numline, numline);else T = ConvertTwo("", WRONG, NO_MATCH, numline, record);LineChar += ArrayChar;fp.get(cbuffer);void HandleOther ()/字符為特殊字符時的處理ArrayCh

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論