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

下載本文檔

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

文檔簡介

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

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

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

4、" ,"return","break","do","while","for","double","float","short"2)運算符和界符 + - * / < <> <= > >= = ; ( ) | & #3)空格由空白、制表符和換行符組成空格一般用來分隔ID、NUM、專用符號和關鍵字,詞法分析階段通常被忽略。1.4、各種單詞符號對應的種別碼表1 各種單詞符號的種別碼單詞符號種

5、別碼char1int2if3else4var5return6break7do8while9for10double11float12short13標識符14數(shù)字15符號16-401.5、 詞法分析程序的主要算法思想算法的基本任務是從文件中讀出字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據(jù)掃描到的單詞符號的第一個字符的種類,拼出相應的單詞符號,并輸出到文件中。2.流程圖:2.1主程序流程圖是否輸入串結(jié)束輸入編譯后的文件名調(diào)用分析子程序結(jié)束開始輸入打開的文件名關閉文件文件為空?是輸入串結(jié)束是主函數(shù)流程圖2.2分析函數(shù)流程圖否否是否是符號字母數(shù)字否是返回0變量初始化忽略空格是否文件

6、結(jié)束獲取一個單詞獲取數(shù)字在文件中寫入當前單詞以及對應的關鍵字種別碼獲取一個完整符號返回開始在文件中寫入當前單詞以及對應的符號種別碼在文件中寫入當前單詞以及對應的符號種別碼在文件中寫入當前單詞以及標識符種別碼12將當前單詞添加到標識符表中存在于數(shù)字表存在于標識符表存在于符號表存在于關鍵字表是將當前數(shù)字添加到數(shù)字表中將當前符號添加到符號表中是分析函數(shù)流程圖3.源代碼:#include<stdio.h>#include<conio.h>#include<math.h>#include<string.h>#include<stdlib.h>i

7、nt i, row = 0, line = 0;char a1000; /程序int number1000100; /常數(shù)表char mark1005; /標識符表FILE *fin,*fout;/詞法分析int wordanalysis() if (ai >= 'A'&&ai <= 'Z')|(ai>='a'&&ai<='z') /分析標識符和關鍵字 char word10; char keyWord100100 = "char","int&q

8、uot;,"if","else","var" ,"return","break","do","while","for","double","float","short" /關鍵字表 int n = 0; wordn+ = ai+; /若字符為AZ或09,則繼續(xù)讀取 while (ai >= 'A'&&ai <= 'Z'

9、) | (ai >= '0' && ai <= '9')|(ai>='a'&&ai<='z') wordn+ = ai+; wordn = '0' i-; /判斷該標識符是否為關鍵字 for (n = 0; n < 100; n+) if (strcmp(word, keyWordn) = 0) fprintf(fout,"%st(%d)t關鍵字n", keyWordn, n + 1); return 3; /判斷該標識符是否存在標識

10、符表中 int m = 0; if (line != 0) int q = 0; while (q<line) if (strcmp(word, markq+) = 0) fprintf(fout,"%st(14,%d)t標識符n", word, q); return 3; /將該標識符保存到標識符表中 strcpy(markline, word); fprintf(fout,"%st(14, %d)t標識符n", word, line + 1); line+; return 3; else if (ai >= '0' &am

11、p;& ai <= '9') /分析常數(shù) char x100; int n = 0, sum; xn+ = ai+; /判斷字符是否是09 while (ai >= '0' && ai <= '9') xn+ = ai+; xn = '0' i-; int num = atoi(x); /將字符串轉(zhuǎn)換成int型 /判斷該常數(shù)是否存在于常數(shù)表中 if (row != 0) int y; for (y = 0; y < 1000; y+) int w = numbery0; sum =

12、0; int d; for (d = 1; d <= numbery0; d+) w = w - 1; sum = sum + numberyd * pow(2, w); if (num = sum) fprintf(fout,"%dt(15,%d)n", num, y + 1); return 3; int z = num, c = num; int m = 0; do /計算是幾位二進制數(shù) z = z / 2; m+; while (z != 0); for (n = m; n > 0; n-) /將二進制保存于常數(shù)表中 numberrown = c % 2

13、; c = c / 2; numberrow0 = m; int line = row; fprintf(fout,"%dt(15,%d)n", num, line + 1); row+; return 3; else /分析符號 switch (ai) case ' ': case 'n': return -1; case '#': return 0; case '=':fprintf(fout,"=t(16)n"); return 3; case '<': i+;

14、if (ai = '=') fprintf(fout,"<= t(17)n"); return 3; else if (ai = '>') fprintf(fout,"<>t(18)n"); return 3; else i-; fprintf(fout,"<t(19)n"); return 3; case '>': i+; if (ai = '=') fprintf(fout,">=t(20)n"); ret

15、urn 3; else i-; fprintf(fout,">t(21)n"); return 3; case '+': fprintf(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-; f

16、printf(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,"t(27)n"); return 3; case '(': fprintf(fout,"(t(28)

17、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,&quo

18、t;t(33)n"); return 3; case '|': fprintf(fout,"|t(34)n"); return 3; case '"': fprintf(fout,""t(35)n");return 3; case ',': fprintf(fout,",t(36)n"); return 3; case ''': fprintf(fout,"'t(37)n"); return 3;/單引號

19、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)編譯原理詞法分析器*nn");printf("n"); int l

20、= 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

21、");return(1);if(fout=NULL)printf("打開詞法分析輸出文件有錯n");return(2);/返回錯誤代碼2printf("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(&quo

溫馨提示

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

評論

0/150

提交評論