詞法分析器的設計與實現編譯原理實驗報告[實驗研究]_第1頁
詞法分析器的設計與實現編譯原理實驗報告[實驗研究]_第2頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、中北大學軟件學院實 驗 報 告 專 業 軟件工程 課程名稱 編譯原理 學 號 1414011712 姓 名 楊倩 輔導教師 張靜 成績 實驗日期2016.5.7實驗時間14:0018:001實驗名稱 :詞法分析器的設計與實現2、實驗目的(1)掌握C語言單詞符號的劃分、正規式、狀態轉換圖及詞法分析器的實現。(2)掌握詞法分析程序的作用。3、實驗要求(1)對任給的一個C語言源程序,能夠濾掉空格、回車換行符、tab鍵及注釋。(2)識別各類單詞符號,如關鍵字、標識符、運算符、常數、界符,結果以二元式形式輸出,并構造符號表。(3)輸出有詞法錯誤的單詞及所在行號。(在此階段只能識別有限的詞法錯誤)4、實驗

2、原理根據掃描到的單詞符號的第一個字符的種類,分別轉到相應的程序進行處理。這些程序的功能就是識別以相應字符開頭的各類單詞符號。5、實驗步驟(1)根據C語言各類單詞的正規式,構造能識別各類單詞的狀態轉換圖。(2)根據狀態轉換圖,構造識別各類單詞的詞法分析器。6、狀態轉換圖及詞法分析程序/詞法分析程序.cpp#include#include#include#include /定義關鍵字char *Key10=main,void,int,char,printf,scanf,else,if,return;char Word20,ch; / 存儲識別出的單詞流int IsAlpha(char c) /判斷

3、是否為字母if(c=a)|(c=A) return 1;else return 0; int IsNum(char c) /判斷是否為數字if(c=0&c=9) return 1;else return 0;int IsKey(char *Word) /識別關鍵字函數int m,i;for(i=0;i9;i+)if(m=strcmp(Word,Keyi)=0)if(i=0)return 2;return 1; return 0;void scanner(FILE *fp) /掃描函數char Word20=0;char ch;int i,c;ch=fgetc(fp); /獲取字符,指針fp并自

4、動指向下一個字符if(IsAlpha(ch) /判斷該字符是否是字母Word0=ch;ch=fgetc(fp);i=1;while(IsNum(ch)|IsAlpha(ch) /判斷該字符是否是字母或數字Wordi=ch;i+;ch=fgetc(fp); Wordi=0; /0 代表字符結束(空格)fseek(fp,-1,1); /回退一個字符c=IsKey(Word); /判斷是否是關鍵字if(c=0) printf(%st$普通標識符nn,Word);/不是關鍵字else if(c=2) printf(%st$主函數nn,Word);else printf(%st$關鍵字nn,Word);

5、 /輸出關鍵字 else /開始判斷的字符不是字母 if(IsNum(ch) /判斷是否是數字 Word0=ch; ch=fgetc(fp); i=1; while(IsNum(ch) Wordi=ch; i+; ch=fgetc(fp); Wordi=0; fseek(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);

6、break; case+:ch=fgetc(fp); Word1=ch; if(ch=) printf(%st$運算符nn,Word);/運算符+= else 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); else if(ch=-) printf(%st$運算符nn,Word); /判斷結果為- else fseek(

7、fp,-1,1); printf(%st$運算符nn,Word); /判斷結果為- break; case*: case/: case!: case=:ch=fgetc(fp); 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); /判斷結果為運算符= else if(ch=) printf(%st$運算符nn,Word); /判斷結果為 else fseek(

8、fp,-1,1); printf(%st$運算符nn,Word); /判斷結果為: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); br

9、eak; default:printf(無法識別字符!nn); break; main()char in_fn30; /文件路徑 FILE *fp; printf(n請輸入源文件路徑及后綴名(源文件需以$結尾):); while(1)gets(in_fn);/scanf(%s,in_fn); if(fp=fopen(in_fn,r)!=NULL) break; /讀取文件內容,并返回文件指針,該指針指向文件的第一個字符 else printf(文件路徑錯誤!請重新輸入:); printf(n詞法分析結果如下:n); do ch=fgetc(fp); if(ch=$) break; /文件以#結

10、尾,作為掃描結束條件 else if(ch= |ch=t|ch=n) /忽略空格,空白,和換行 else fseek(fp,-1,1); /回退一個字節開始識別單詞流 scanner(fp); while(ch!=$); system(pause); return(0);/test.cpp 測試程序 路徑:D:test.cppmain()int score;char grade;printf(please input a scoren);scanf(%d,amp;score);grade=score=90?A:(scoregt;=60?B:C);printf(%d belongs to %c,score,grade);$7、 測試及結果1、登陸界面:2、出錯異常處理:3、結果分析:8、心得 在本次實驗中,我糾正了一個一直以來的概念錯誤:main不是關鍵字,它定義為程序的入口,是主函數!在本實驗中,雖然我把main初始化在關鍵字表(字符指針類型數組)*Key10中,當與該數組中字符串進行比較時,若與main匹配成功,則返回2,

溫馨提示

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

評論

0/150

提交評論