編譯原理實驗-詞法分析器(精編版)_第1頁
編譯原理實驗-詞法分析器(精編版)_第2頁
編譯原理實驗-詞法分析器(精編版)_第3頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、. . 1 / 11 理工學院實驗報告院部計算機系班級b150402 學號課程名稱編譯原理實驗日期2018.6.4 實驗名稱詞法分析器成績實驗?zāi)康模杭由顚υ~法分析過程的理解;加強對詞法分析方法的掌握;能夠采用一種編程語言實現(xiàn)簡單的詞法分析;能夠使自己編寫的程序?qū)唵蔚某绦蚱芜M行詞法分析。實驗條件:裝有 windows操作系統(tǒng), microsoft visual c+ 6.0。實驗容:自定義一種程序設(shè)計語言,或選擇已有的一種高級語言(c 語言),編制它的詞法分析程序。實驗要求:1. 對單詞的構(gòu)成規(guī)則有明確的定義2. 編寫的程序能夠正確識別源程序中的單詞符號3. 識別出的單詞以 的形式保存在符號

2、表中4. 詞法分析中源程序和分析后的符號表均保存在.txt文件中5. 有一定的檢查錯誤的能力。遇到錯誤時可顯示“error ” ,然后跳過錯誤部分繼續(xù)顯示。6. 實驗報告包括以下容(1) 編程思路、流程圖、源代碼(2) 上機調(diào)試時發(fā)現(xiàn)的問題,以與解決的過程(3) 所使用的測試數(shù)據(jù)與結(jié)果(4) 心得體會實驗步驟1. 給出目標語言的所有單詞符號與種別編碼、單詞符號的狀態(tài)轉(zhuǎn)換圖。2. 依次讀入源程序,對源程序進行單詞切分和識別,直到源程序完畢。3. 對正確的單詞,按照它的種別以的形式保存在符號表中。4. 對不正確的單詞,做出錯誤處理。. . 2 / 11 實驗容:1. 編程思路 : 1.1 、實現(xiàn)預(yù)

3、處理功能源程序中可能包含有對程序執(zhí)行無意義的符號,要求將其剔除。首先編制一個源程序的輸入過程,從鍵盤、文件或文本框輸入若干行語句,依次存入輸入緩沖區(qū)(字符型數(shù)據(jù)) ;然后編制一個預(yù)處理子程序,去掉輸入串中的回車符、換行符和跳格符等編輯性文字;把多個空白符合并為一個;去掉注釋。 1.2、實現(xiàn)詞法分析功能輸入:所給文法的源程序字符串。輸出:將每個單詞或數(shù)字以與他對應(yīng)的種別碼和類型輸出到文件中。具體實現(xiàn)時,可以將單詞的二元組用結(jié)構(gòu)進行處理。1.3 、待分析的c語言子集的詞法1)關(guān)鍵字char,int,if,else,var ,return,break,do,while,for,double,floa

4、t,short 2)運算符和界符 + - * / = = ;( ) | & # 3)空格由空白、制表符和換行符組成空格一般用來分隔id、num 、專用符號和關(guān)鍵字,詞法分析階段通常被忽略。1.4 、各種單詞符號對應(yīng)的種別碼表 1 各種單詞符號的種別碼單詞符號種別碼char 1 int 2 if 3 else 4 var 5 return 6 break 7 do 8 while 9 for 10 double 11 float 12 short 13 標識符14 數(shù)字15 符號16-40 . . 3 / 11 1.5 、 詞法分析程序的主要算法思想算法的基本任務(wù)是從文件中讀出字符串表示

5、的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據(jù)掃描到的單詞符號的第一個字符的種類,拼出相應(yīng)的單詞符號 , 并輸出到文件中。2. 流程圖:2.1 主程序流程圖主函數(shù)流程圖否輸入編譯后的文件名調(diào)用分析子程序完畢開始輸入打開的文件名關(guān)閉文件文件為空?是輸入串完畢是. . 4 / 11 2.2 分析函數(shù)流程圖分析函數(shù)流程圖3. 源代碼:#include #include #include #include #include int i, row = 0, line = 0; char a1000; /程序int number1000100; /常數(shù)表char mark1005; /標識符表f

6、ile *fin,*fout; 否否是否是符號字數(shù)否是返回變 量 初 始忽略空格是否文件完畢獲 取 一 個 單獲取數(shù)字在文件中寫入當前單詞以與對應(yīng)的關(guān)鍵字種別獲取一個完整符返回開始在文件中寫入當前單詞以與對應(yīng)的符號種在文件中寫入當前單詞以與對應(yīng)的符號種在文件中寫入當前單詞以與標識符種別碼12 將當前單詞添加到標識符表存 在 于 數(shù) 字存 在 于 標 識 符存 在 于 符 號存 在 于 關(guān) 鍵 字是將當前數(shù)字添加到數(shù)字表中將當前符號添加到符號表中是. . 5 / 11 / 詞法分析int wordanalysis() if (ai = a&ai =a&ai= a&ai =

7、 0 & ai =a&ai=z) wordn+ = ai+; wordn = 0; i-; /判斷該標識符是否為關(guān)鍵字 for (n = 0; n 100; n+) if (strcmp(word, keywordn) = 0) fprintf(fout,%st(%d)t關(guān)鍵字 n, keywordn, n + 1); return 3; /判斷該標識符是否存在標識符表中 int m = 0; if (line != 0) int q = 0; while (q= 0 & ai = 0 & ai = 9) xn+ = ai+; xn = 0; i-; int n

8、um = atoi(x); /將字符串轉(zhuǎn)換成int型 /判斷該常數(shù)是否存在于常數(shù)表中 if (row != 0) int y; for (y = 0; y 1000; y+) int w = numbery0; sum = 0; int d; for (d = 1; d 0; n-) /將二進制保存于常數(shù)表中. . 7 / 11 numberrown = c % 2; c = c / 2; numberrow0 = m; int line = row; fprintf(fout,%dt(15,%d)n, num, line + 1); row+; return 3; else /分析符號 sw

9、itch (ai) case : case n: return -1; case #: return 0; case =:fprintf(fout,=t(16)n); return 3; case : i+; if (ai = =) fprintf(fout,) fprintf(fout,t(18)n); return 3; else i-; fprintf(fout,: i+; if (ai = =) fprintf(fout,=t(20)n); return 3; else i-; fprintf(fout,t(21)n); return 3; . . 8 / 11 case +: fpr

10、intf(fout,+t(22)n); return 3; case -: fprintf(fout,-t(23)n); return 3; case *: fprintf(fout,*t(24)n); return 3; case /: i+; if(ai!=/) i-; fprintf(fout,/t(25)n); return 3; else while(1) if(ai+=n) return -1; fprintf(fout,/t(35)n);return 3; case : fprintf(fout,:t(26)n); return 3; case ;: fprintf(fout,;

11、t(27)n); return 3; case (: fprintf(fout,(t(28)n); return 3; case ): fprintf(fout,)t(29)n); return 3; case : fprintf(fout,t(30)n); return 3; case : fprintf(fout,t(31)n); return 3; case : fprintf(fout,t(32)n); return 3; case : fprintf(fout,t(33)n); return 3; case |: fprintf(fout,|t(34)n); return 3; ca

12、se : fprintf(fout,t(35)n);return 3; case ,: fprintf(fout,t(36)n); return 3; case : fprintf(fout,t(37)n); return 3;/單引號 case &: i+; if(ai!=&) i-; fprintf(fout,&t(38)n); return 3; else fprintf(fout,&t(39)n);return 3; case : fprintf(fout,t(40)n); return 3; int main() printf(*c語言實現(xiàn)編譯原理詞法

13、分析器*nn); . . 9 / 11 printf(n); int l = 0; int m; i = 0; char input100,output100;/輸入文件和輸出文件的路徑和文件名 printf(請輸入詞法分析輸入的文件名( 包括路徑):); scanf(%s,input); printf(請輸入詞法分析輸出的文件名( 包括路徑):); scanf(%s,output); fin=fopen(input,r); fout=fopen(output,w); if(fin=null) printf(打開詞法分析輸入文件有錯n); return(1); if(fout=null) pr

14、intf(打開詞法分析輸出文件有錯n); return(2);/返回錯誤代碼2 printf(n-開始進行詞法分析-n); while (!feof(fin) al+ = fgetc(fin); al = #; do m = wordanalysis(); switch (m) case -1:i+; break; case 0: i+; break; case 3: i+; break; while (m != 0); fclose(fin); fclose(fout); printf(n-詞法分析執(zhí)行完畢-n); _getch(); return 0; 4. 上機調(diào)試時發(fā)現(xiàn)的問題,以與解決

15、的過程: 1)文件讀取錯誤。運行程序后,輸入文件路徑后,顯示“打開詞法分析輸入文件有錯” 。解決:我看了下程序,沒發(fā)現(xiàn)什么明顯錯誤,然后看了文件名111.txt ,也是對的,點開文件屬性, 發(fā)現(xiàn)文件名顯示的是111.txt.txt,意識到機房電腦默認沒顯示后綴,自己起名字的時候多加了一個.txt;2)運行過程中強行停止。解決:檢查了一下程序,發(fā)現(xiàn)關(guān)鍵字表數(shù)組下標溢出,. . 10 / 11 后來改了循環(huán)的條件。3) 運行不能正常停止。解決:ms-dos 命令窗口未關(guān)閉的時候,檢查輸出文件是否存在,發(fā)現(xiàn)存在但是打開為空,然后關(guān)閉運行窗口后再打開發(fā)現(xiàn)輸出結(jié)果已經(jīng)寫入了文件,只是沒有執(zhí)行fclose()所以打開后看不到容。4)某些關(guān)鍵字被作為標識符輸出。解決:檢查程序發(fā)現(xiàn)關(guān)鍵字表不夠完整,所以不能輸出不存在于關(guān)鍵字表中的種別碼,然后完善了關(guān)鍵字表。5)單詞、數(shù)字、符號重復(fù)出現(xiàn)時,序號不一致。解決:增加了一個標識符表、數(shù)字表以與符號表,判斷過詞性時, 先判斷一下是

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論