2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  《編譯原理》課程設(shè)計(jì)</p><p>  題 目: 詞法分析器 </p><p>  班 級(jí): 計(jì)算機(jī)科學(xué)系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.概要設(shè)計(jì)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.詳細(xì)設(shè)計(jì)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運(yùn)行結(jié)果10</p><p><b>  5.用戶手冊(cè)11</b></p><p>  5.1運(yùn)行環(huán)境11</p><p>  5.2執(zhí)行文件11</p><p&g

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

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

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

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

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

10、";",",",".","(",")",":"</p><p>  (4)其他標(biāo)記 如字符串,表示以字母開頭的標(biāo)識(shí)符。(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í)別關(guān)鍵字函數(shù)</p><p>  void scanner(FILE *fp)//掃描函數(shù)</p><p><b>  2.2流程圖:&

12、lt;/b></p><p><b>  3.詳細(xì)設(shè)計(jì)</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 //定義關(guān)鍵字</p><p>  *Key[10]={"main","void","int","char","printf","scanf","else",&qu

14、ot;if","return"};</p><p>  char Word[20],ch; // 存儲(chǔ)識(shí)別出的單詞流</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í)別關(guān)鍵字函數(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并自動(dòng)指向下一個(gè)字符</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); //回退一個(gè)字符</p><p>  c=IsKey(Word); //判斷是否是關(guān)鍵字</p><p>  if(c==0) printf("%s\t$普通標(biāo)識(shí)符\n\n",Word);//不是關(guān)鍵字<

25、/p><p>  else if(c==2) printf("%s\t$主函數(shù)\n\n",Word);</p><p>  else printf("%s\t$關(guān)鍵字\n\n",Word); //輸出關(guān)鍵字</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$無符號(hào)實(shí)數(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$運(yùn)算符\n\n",Word);//運(yùn)算符“+=”</p><p><b>  }</b></p><p>  else if(ch=='+'){</p><p>  printf("%s\t$運(yùn)算符\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$運(yùn)算符\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$運(yùn)算符

36、\n\n",Word); }</p><p>  else if(ch=='-'){</p><p>  printf("%s\t$運(yùn)算符\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$運(yùn)算符\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$運(yùn)算符\n\n",Word);</p><p><b>  }</b></p><p><b>  else {</b></p><p>

40、;  fseek(fp,-1,1);</p><p>  printf("%s\t$運(yùn)算符\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$運(yùn)算符\n\n",Word); //判斷結(jié)果為運(yùn)算符“<=”</p><p><b>  }</b></p><

42、p>  else if(ch=='<'){</p><p>  printf("%s\t$運(yùn)算符\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$運(yùn)算符\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$運(yùn)算符\n\n",Word);</p><p><b>  else {</b></p><p>  fseek(fp

45、,-1,1);</p><p>  printf("%s\t$運(yùn)算符\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$運(yùn)算符\n\n",Word);}</p><p>  if(IsAlpha(ch)) printf("%s\t$類型標(biāo)識(shí)符\n\n",Word);</p><p><b>  e

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

48、lt;p>  default:printf("無法識(shí)別字符!\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("/* 編譯原理課程設(shè)計(jì) */\n\n");</p>

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

52、></p><p>  printf("\n請(qǐng)輸入源文件名(包括路徑和后綴名):");</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)容,并返回文件指針,該指針指向文件的第一個(gè)字符</p><p>  else printf("文件路徑錯(cuò)誤!請(qǐng)重新輸入:");</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); //回退一個(gè)字節(jié)開始識(shí)別單詞流</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ù)時(shí),運(yùn)行結(jié)果如下:</p><p>  2.文件輸入錯(cuò)誤時(shí),運(yùn)行結(jié)果如下:</p><p><b>  4.3運(yùn)行結(jié)果</b></p><p><b>  5.用戶

60、手冊(cè)</b></p><p><b>  5.1運(yùn)行環(huán)境</b></p><p>  *硬件環(huán)境:多媒體計(jì)算機(jī)。</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.參考文獻(xiàn)</b></p><p>  陳火旺.程序設(shè)計(jì)語言編譯原理.北京:國防工業(yè)出版社,2012</p><p>  王磊.編譯原理上機(jī)指導(dǎo).北京:科學(xué)電出版社,2009</p><p>  Alfred

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論