課程設計詞法分析器_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《編譯原理》課程設計</p><p>  題 目: 詞法分析器 </p><p>  班 級: 計算機科學系0901班 </p><p>  2012 年 6 月 08 日</p><p><b>  目錄</b></p><p&

2、gt;<b>  1.需求分析1</b></p><p><b>  1.1問題描述1</b></p><p><b>  1.2基本要求1</b></p><p><b>  2.概要設計1</b></p><p>  2.1待分析的簡單語言詞法

3、1</p><p><b>  2.2主要函數(shù)2</b></p><p><b>  2.2流程圖:3</b></p><p><b>  3.詳細設計4</b></p><p><b>  4.調(diào)試與分析8</b></p><

4、;p>  4.1解析源文件8</p><p>  4.2調(diào)試與分析9</p><p>  4.3運行結(jié)果10</p><p><b>  5.用戶手冊11</b></p><p>  5.1運行環(huán)境11</p><p>  5.2執(zhí)行文件11</p><p&g

5、t;<b>  6.參考文獻12</b></p><p><b>  7.心得體會12</b></p><p>  8.小組成員任務分配及工作進度安排12</p><p><b>  1.需求分析</b></p><p><b>  1.1問題描述</b&

6、gt;</p><p>  本次課程設計旨在是設計并實現(xiàn)一個具體的詞法分析程序,加深對詞法分析的原理的理解。該詞法分析程序能輸入源程序并輸出單詞符號。在掃描源程序字符串時,一旦識別出關鍵字、分隔符、標識符、無符號常數(shù)中之一,即以單詞形式(各類單詞均采用相同的結(jié)構(gòu),即二元式編碼形式)輸出。每次調(diào)用詞法分析程序,它均能自動繼續(xù)掃描下去,形成下一個單詞,直至整個源程序全部掃描完畢,并形成相應的單詞串形式的源程序。<

7、;/p><p><b>  1.2基本要求</b></p><p>  1.對給定的程序通過詞法分析器能夠識別一個個單詞符號,并以二元式(單詞類型,單詞符號)顯示;</p><p>  2.可以將要分析的程序保存到文件中進行讀?。?lt;/p><p>  3.刪除無用的空白字符、回車符、及其它非實質(zhì)性符號。</p>

8、<p><b>  2.概要設計</b></p><p>  2.1待分析的簡單語言詞法</p><p>  (1)關鍵字"main","void","int","char","printf","scanf","else&quo

9、t;,"if","return"</p><p>  (2)運算符:"+","-","*","/","="</p><p>  (3)界符:"{","}","[","]",

10、";",",",".","(",")",":"</p><p>  (4)其他標記 如字符串,表示以字母開頭的標識符。(5)空格、回車、換行符跳過。</p><p><b>  2.2主要函數(shù)</b></p><p>  i

11、nt IsAlpha(char c)//判斷是否為字母</p><p>  int IsNum(char c)//判斷是否為數(shù)字</p><p>  int IsKey(char *Word)//識別關鍵字函數(shù)</p><p>  void scanner(FILE *fp)//掃描函數(shù)</p><p><b>  2.2流程圖:&

12、lt;/b></p><p><b>  3.詳細設計</b></p><p>  #include<string.h></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  

13、#include<ctype.h></p><p>  char //定義關鍵字</p><p>  *Key[10]={"main","void","int","char","printf","scanf","else",&qu

14、ot;if","return"};</p><p>  char Word[20],ch; // 存儲識別出的單詞流</p><p>  int IsAlpha(char c) //判斷是否為字母</p><p>  { </p><p>  if

15、(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;</p><p>  else return 0;</p><p><b>  }</b></p><p>  int

16、 IsNum(char c) //判斷是否為數(shù)字</p><p>  { </p><p>  if(c>='0'&&c<='9') return 1;</p><p>  else return 0;</p><p><b>  }</b

17、></p><p>  int IsKey(char *Word) //識別關鍵字函數(shù)</p><p>  { </p><p><b>  int m,i;</b></p><p>  for(i=0;i<9;i++)</p><p><b>  {<

18、/b></p><p>  if((m=strcmp(Word,Key[i]))==0)</p><p><b>  {</b></p><p><b>  if(i==0)</b></p><p><b>  return 2;</b></p><p

19、><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p

20、><p>  void scanner(FILE *fp) //掃描函數(shù)</p><p><b>  { </b></p><p>  char Word[20]={'\0'};</p><p><b>  char ch;</b></p><p>&

21、lt;b>  int i,c;</b></p><p>  ch=fgetc(fp); //獲取字符,指針fp并自動指向下一個字符</p><p>  if(IsAlpha(ch)) //判斷該字符是否是字母</p><p>  { </p><p>  Word[0]=ch;</p&

22、gt;<p>  ch=fgetc(fp);</p><p><b>  i=1;</b></p><p>  while(IsNum(ch)||IsAlpha(ch)) //判斷該字符是否是字母或數(shù)字</p><p><b>  { </b></p><p>  Word[i]=

23、ch;</p><p><b>  i++;</b></p><p>  ch=fgetc(fp);</p><p><b>  }</b></p><p>  Word[i]='\0'; //'\0' 代表字符結(jié)束(空格)</p><

24、p>  fseek(fp,-1,1); //回退一個字符</p><p>  c=IsKey(Word); //判斷是否是關鍵字</p><p>  if(c==0) printf("%s\t$普通標識符\n\n",Word);//不是關鍵字<

25、/p><p>  else if(c==2) printf("%s\t$主函數(shù)\n\n",Word);</p><p>  else printf("%s\t$關鍵字\n\n",Word); //輸出關鍵字</p><p><b>  }</b></p><p>  

26、else //開始判斷的字符不是字母</p><p>  if(IsNum(ch))</p><p>  { //判斷是否是數(shù)字</p><p>  Word[0]=ch;</p><p>  ch=fgetc(fp);</p><p>&

27、lt;b>  i=1;</b></p><p>  while(IsNum(ch)){</p><p>  Word[i]=ch;</p><p><b>  i++;</b></p><p>  ch=fgetc(fp);</p><p><b>  }</b&

28、gt;</p><p>  Word[i]='\0';</p><p>  fseek(fp,-1,1); //回退</p><p>  printf("%s\t$無符號實數(shù)\n\n",Word);</p><p><b>  }</b></

29、p><p>  else //開始判斷的字符不是字母也不是數(shù)字</p><p><b>  {</b></p><p>  Word[0]=ch;</p><p>  switch(ch){</p><p><b>  case'[':</b>&l

30、t;/p><p><b>  case']':</b></p><p><b>  case'(':</b></p><p><b>  case')':</b></p><p><b>  case'{':

31、</b></p><p><b>  case'}':</b></p><p><b>  case',':</b></p><p><b>  case'"':</b></p><p>  case'

32、;;':printf("%s\t$界符\n\n",Word); break;</p><p>  case'+':ch=fgetc(fp);</p><p>  Word[1]=ch;</p><p>  if(ch=='='){</p><p>  printf("%s\

33、t$運算符\n\n",Word);//運算符“+=”</p><p><b>  }</b></p><p>  else if(ch=='+'){</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為“++”</p><p><

34、b>  }</b></p><p><b>  else {</b></p><p>  fseek(fp,-1,1);</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為“+”</p><p><b>  }</b>&

35、lt;/p><p><b>  break;</b></p><p>  case'-':ch=fgetc(fp);</p><p>  Word[1]=ch;</p><p>  if(ch=='='){</p><p>  printf("%s\t$運算符

36、\n\n",Word); }</p><p>  else if(ch=='-'){</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為“--”</p><p><b>  }</b></p><p><b>

37、  else {</b></p><p>  fseek(fp,-1,1);</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為“-”</p><p><b>  }</b></p><p><b>  break;</b>&

38、lt;/p><p><b>  case'*':</b></p><p><b>  case'/':</b></p><p><b>  case'!':</b></p><p>  case'=':ch=fgetc

39、(fp);</p><p>  if(ch=='='){</p><p>  printf("%s\t$運算符\n\n",Word);</p><p><b>  }</b></p><p><b>  else {</b></p><p>

40、;  fseek(fp,-1,1);</p><p>  printf("%s\t$運算符\n\n",Word);</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case'<':ch=fgetc

41、(fp);</p><p>  Word[1]=ch;</p><p>  if(ch=='='){</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為運算符“<=”</p><p><b>  }</b></p><

42、p>  else if(ch=='<'){</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為“<<”</p><p><b>  } </b></p><p><b>  else {</b></p>&l

43、t;p>  fseek(fp,-1,1);</p><p>  printf("%s\t$運算符\n\n",Word); //判斷結(jié)果為“<”</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case

44、9;>':ch=fgetc(fp); </p><p>  Word[1]=ch;</p><p>  if(ch=='=') printf("%s\t$運算符\n\n",Word);</p><p><b>  else {</b></p><p>  fseek(fp

45、,-1,1);</p><p>  printf("%s\t$運算符\n\n",Word);</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case'%':ch=fgetc(fp); </p&g

46、t;<p>  Word[1]=ch;</p><p>  if(ch=='='){printf("%s\t$運算符\n\n",Word);}</p><p>  if(IsAlpha(ch)) printf("%s\t$類型標識符\n\n",Word);</p><p><b>  e

47、lse {</b></p><p>  fseek(fp,-1,1);</p><p>  printf("%s\t$取余運算符\n\n",Word);</p><p><b>  }</b></p><p><b>  break;</b></p>&

48、lt;p>  default:printf("無法識別字符!\n\n"); break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  ma

49、in()</b></p><p><b>  { </b></p><p>  printf("////////////////////////////////////////////////////////////////////////////////\n\n");</p><p>  printf(&qu

50、ot;/**********************************詞法分析器**********************************/\n\n");</p><p>  printf("/* 編譯原理課程設計 */\n\n");</p>

51、<p>  printf("/* 0901班 侯陽琳 李彩鳳 蘆光霞 張進 */\n\n");</p><p>  char in_fn[30]; //文件路徑</p><p><b>  FILE *fp;</b

52、></p><p>  printf("\n請輸入源文件名(包括路徑和后綴名):");</p><p>  while(true){</p><p>  gets(in_fn);</p><p>  //scanf("%s",in_fn);</p><p>  if((fp

53、=fopen(in_fn,"r"))!=NULL) break; </p><p>  //讀取文件內(nèi)容,并返回文件指針,該指針指向文件的第一個字符</p><p>  else printf("文件路徑錯誤!請重新輸入:");</p><p><b>  }</b></p><p

54、>  printf("\n******************* 詞法分析結(jié)果如下 *******************\n");</p><p><b>  do{</b></p><p>  ch=fgetc(fp);</p><p>  if(ch=='#') break;

55、//文件以#結(jié)尾,作為掃描結(jié)束條件</p><p>  else if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格,空白,和換行</p><p><b>  else</b></p><p><b>  {</b></p><

56、;p>  fseek(fp,-1,1); //回退一個字節(jié)開始識別單詞流</p><p>  scanner(fp);</p><p><b>  }</b></p><p>  }while(ch!='#');</p><p>  return(0);</p>&

57、lt;p><b>  }</b></p><p><b>  4.調(diào)試與分析</b></p><p><b>  4.1解析源文件</b></p><p>  void main()</p><p><b>  {</b></p>&l

58、t;p><b>  int a=3;</b></p><p><b>  a+=b;</b></p><p>  printf("%d",a); </p><p><b>  return;</b></p><p><b>  }</b

59、></p><p><b>  4.2調(diào)試與分析</b></p><p>  1.未輸入任何數(shù)據(jù)時,運行結(jié)果如下:</p><p>  2.文件輸入錯誤時,運行結(jié)果如下:</p><p><b>  4.3運行結(jié)果</b></p><p><b>  5.用戶

60、手冊</b></p><p><b>  5.1運行環(huán)境</b></p><p>  *硬件環(huán)境:多媒體計算機。</p><p>  *軟件環(huán)境:Windows 2003;Microsoft Visual C++6.0。</p><p><b>  5.2執(zhí)行文件</b></p&g

61、t;<p><b>  *詞法.exe</b></p><p><b>  6.參考文獻</b></p><p>  陳火旺.程序設計語言編譯原理.北京:國防工業(yè)出版社,2012</p><p>  王磊.編譯原理上機指導.北京:科學電出版社,2009</p><p>  Alfred

62、 V.Aho.編譯原理.北京:機械工業(yè)出版社,2009</p><p><b>  7.心得體會</b></p><p>  通過此次實驗,讓我們對實驗原理有更深的理解. 通過該課程設計,掌握了什么是編譯程序,編譯程序工作的基本過程及其各階段的基本任務,熟悉了編譯程序總流程框圖,了解了編譯程序的生成過程、構(gòu)造工具及其相關的技術對課本上的知識有了更深的理解。通過把該算法

63、的內(nèi)容,算法的執(zhí)行順序在計算機上實現(xiàn),把原來以為很深奧的書本知識變的更為簡單,對實驗原理有更深的理解。了解到如何設計、編制并調(diào)試詞法分析程序,加深對詞法分析原理的理解,熟悉了構(gòu)造詞法分析程序的手工方式的相關原理,使用C語言直接編寫此法分析程序。另外,也讓我們熟悉了C語言的相關內(nèi)容,加深了對C語言的用途的理解。全面系統(tǒng)的理解了編譯原理程序構(gòu)造的一般原理和基本實現(xiàn)方法。把死板的課本知識變得生動有趣,激發(fā)了學習的積極性。把學過的計算機編譯原理

64、的知識強化,能夠把課堂上學的知識通過自己設計的程序表示出來,加深了對理論知識的理解。</p><p>  8.小組成員任務分配及工作進度安排</p><p>  小組成員:侯陽琳、李彩鳳、蘆光霞、張進</p><p>  任務分配:李彩鳳、張進主要負責程序編程和調(diào)試</p><p>  侯陽琳、蘆光霞主要負責文本輸入、排版工作及心得體會<

溫馨提示

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

評論

0/150

提交評論