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

下載本文檔

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

文檔簡介

1、詞法分析器實驗報告一、實驗目的及要求本次實驗通過用 C 語言 設計、編制、調試一個詞法分析子程序, 識別單詞,實現一個 C 語言詞法分析器,經過此過程可以加深對編譯 器解析單詞流的過程的了解。運行環(huán)境 :硬件:windows xp軟件:visual c+二、實驗步驟1. 查詢資料,了解詞法分析器的工作過程與原理。2. 分析題目,整理出基本設計思路。3. 實踐編碼,將設計思想轉換用 c 語言編碼實現,編譯運行。4. 測試功能,多次設置包含不同字符,關鍵字的待解析文件,仔細察 看運行結果, 檢測該分析器的分析結果是否正確。 通過最終的測試發(fā) 現問題, 逐漸完善代碼中設置的分析對象與關鍵字表, 拓寬

2、分析范圍 提高分析能力。三、實驗內容本實驗中將 c 語言單詞符號分成了四類: 關鍵字 key(特別的將 main說明為主函數)、普通標示符、常數和界符。將關鍵字初始化在 一個字符型指針數組 *key 中,將界符分別由程序中的 case 列出。 在詞法分析過程中,關鍵字表和 case 列出的界符的內容是固定不變 的(由程序中的初始化確定) ,因此,從源文件字符串中識別出現的 關鍵字,界符只能從其中選取。標識符、常數是在分析過程中不斷形 成的。對于一個具體源程序而言, 在掃描字符串時識別出一個單詞, 若 這個單詞的類型是關鍵字、普通標示符、常數或界符中之一,那么就 將此單詞以文字說明的形式輸出 每

3、次調用詞法分析程序, 它均能自 動繼續(xù)掃描下去,形成下一個單詞,直到整個源程序全部掃描完畢,從而形成相應的單詞串。輸出形式例如: void $ 關鍵字流程圖、程序流程圖:開始 .丿輸入源文 件路徑+路徑是否效是回退初始化文件指針.識別指針內容文件結束?否跳過該字符指向下一字符指向下一字符是字母惑數字nn將字符加入字符數組Word是是是數字嗎丫否輸出word為常數將字符加入字符數組Word將字符加入字符數組Word輸出word為界符輸出Word內容為不可識別指向下一字符4程序:#include#include#include i=1;while(IsNum(ch)|IsAlpha(ch) /判斷

4、該字符是否是字母或數字Wordi=ch;i+; ch=fgetc(fp);#include/定義關鍵char*Key10=main,void,int,char,printf,scanf,else,if,return;char Word20,ch; /存儲識別出的單詞流int IsAlpha(char c) /判斷是否為字母if(c=a)|(c=A) return 1; elsereturn 0;int IsNum(char c) /if(c=0&c=9) return 1;else return 0;判斷是否為數int IsKey(char *Word) /識別關鍵字函數int m,i

5、;for(i=0;i9;i+)if(m=strcmp(Word,Keyi)=0)if(i=0) return 2;return 1;return 0;void scanner(FILE *fp) / charWord20=0; char ch;int i,c;ch=fgetc(fp); /if(IsAlpha(ch) /Word0=ch;ch=fgetc(fp);掃描函獲取字符,指針fp并自動指向下一個字符 判斷該字符是否是字母Word0=ch; ch=fgetc(fp); i=1;while(IsNum(ch) Wordi=ch; i+; ch=fgetc(fp);Wordi=0;fseek

6、(fp,-1,1); /回退printf(%st$無符號實數nn,Word);else /開始判斷的字符不是字母也不是數字Word0=ch; switch(ch) case: case: case(: case): case:case: case,: case: case;:printf(%st$界符nn,Word);break;case+:ch=fgetc(fp);Word1=ch; if(ch=)elseWordi=0; /0代表字符結束(空格)/回退一個字符/判斷是否是關鍵字普通標識符nn,Word);/不是關鍵字 主函數nn,Word);關鍵字nn,Word); /輸出關鍵字/開始判斷

7、的字符不是if(IsNum(ch)/判斷是否是數字printf(%st$elseif(ch=+) printf(%st$ elsefseek(fp,-1,1);printf(%st$break;case-:ch=fgetc(fp);Word1=ch;if(ch=) printf(%st$ elseif(ch=-) printf(%st$ else fseek(fp,-1,1);printf(%st$ break;case*:case/:case!:case=:ch=fgetc(fp);if(ch=) printf(%st$ else fseek(fp,-1,1);printf(%st$ bre

8、ak;case:ch=fgetc(fp);Word1=ch;if(ch=)運算符nn,Word);/運算符nn,Word); /運算符nn,Word); /運算符nn,Word);運算符nn,Word); /運算符nn,Word); /運算符nn,Word);運算符nn,Word);printf(%st$運算符nn,Word); /判斷結果為運算符else if(ch=)printf(%st$運算符nn,Word); /判斷結果為“”else =”運算符“+=”判斷結果為“+”判斷結果為“+”判斷結果為“-”判斷結果為“-”fseek(fp,-1,1);printf(%st$運算符nn,Wor

9、d); /判斷結果為“:ch=fgetc(fp);Word1=ch;if(ch=) printf(%st$運算符nn,Word);else fseek(fp,-1,1); printf(%st$運算符nn,Word);break; case%:ch=fgetc(fp);Word1=ch;if(ch=)printf(%st$運算符nn,Word); if(IsAlpha(ch)printf(%st$類型標識符nn,Word);else fseek(fp,-1,1); printf(%st$取余運算符nn,Word);break;default:printf(無法識別字符!nn); break;m

10、ain()char in_fn30; /文件路徑FILE *fp;printf(n請輸入源文件名(包括路徑和后綴名):); while(1)gets(in_fn);指針指向文件的第一個字符else printf(文件路徑錯誤!請重新輸入:);/scanf(%s,in_fn);if(fp=fopen(in_fn,r)!=NULL) break; /讀取文件內容,并返回文件指針,該printf(n*詞法分析結果*n);doch=fgetc(fp);if(ch=#) break; /文件以#結尾,作為掃描結束條件else if(ch= |ch=t|ch=n) /忽略空格,空白,和換行elsewhil

11、e(ch!=#); return(0);4. 實驗結果解析源文件:void main()int a=3;a+=b;printf(%d,a);return;#解析結果:5. 實驗總結分析通過本次實驗, 讓再次瀏覽了有關c語言的一些基本知識, 特別是對文件, 字符串進行 基本操作的方法。C語言中沒有string類型,因此本實驗中的對字符串提取與識別均借助#include及字符型數組來實現。 讓我練習對字符串函數應用的同時也提高了自己的邏輯思 維能力。在本次實驗中,我糾正了一個一直以來的概念錯誤:main不是關鍵字,它定義為程序 的入口,是主函數!在本實驗中,雖然我把main初始化在關鍵字表(字符指針類型數組)*Key10中,當與該數組中字符串進行比較時, 若與main匹配成功, 則返回2,若為其他關鍵字則返回1,以此來把main從關鍵字中區(qū)

溫馨提示

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

評論

0/150

提交評論