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

下載本文檔

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

文檔簡介

1、<p><b>  編譯原理課程設(shè)計(jì)</b></p><p><b>  詞法分析程序</b></p><p>  姓名 : ******* </p><p>  班級(jí) :******************** </p>&l

2、t;p>  學(xué)號(hào) : ************ </p><p>  日期 : 2011-12-30 </p><p><b>  詞法分析程序設(shè)計(jì)</b></p><p><b>  課程設(shè)計(jì)目的:</b></p><p>  運(yùn)用所學(xué)習(xí)的知識(shí)和語言,設(shè)計(jì)編

3、制和調(diào)試一個(gè)具體的詞法分析程序,通過運(yùn)行程序從而加深對(duì)詞法分析的理解。</p><p><b>  課程設(shè)計(jì)要求:</b></p><p>  通過對(duì)PL/0詞法分析程序(GETSYS)的分析,編制一個(gè)具有以下功能的詞法分析程序:</p><p>  a.輸入待進(jìn)行詞法分析的源程序,輸出為單詞串,即由(單詞,類別)所組成的二元組序列;</

4、p><p>  b.有一定的錯(cuò)誤檢查能力,例如能發(fā)現(xiàn)2a這類不能作為單詞的字符串。</p><p><b>  課程設(shè)計(jì)思路:</b></p><p>  詞法分析所能分辨的符號(hào)有,常數(shù),字符,關(guān)鍵字,界符,運(yùn)算符等類型,設(shè)計(jì)的程序要求可以分辨各種不同的類型,可以運(yùn)用C語言文件操作的功能,導(dǎo)入一個(gè)已經(jīng)存在的文本文件,對(duì)文本文件的內(nèi)容進(jìn)行此法分析,并

5、且把分析結(jié)果導(dǎo)入到另外一個(gè)文件當(dāng)中。</p><p><b>  主要變量說明: </b></p><p>  運(yùn)用C語言的宏定義功能,1~11這十二個(gè)數(shù)字分別用來表示不同的關(guān)鍵字,12代表標(biāo)示符類型ID,13代表常數(shù)類型INT,14代表界符類型JF,15代表運(yùn)算符類型YSF。定義一個(gè)長度為30的數(shù)組,用來存放標(biāo)示符和常量。設(shè)置指向固定文件的指針write和read,

6、用來進(jìn)行對(duì)文件的操作。</p><p><b>  算法描述:</b></p><p>  設(shè)置一個(gè)字符串匹配函數(shù)looksame,對(duì)于以字母開頭的字符串,對(duì)其進(jìn)行與關(guān)鍵字的匹配,如果對(duì)于匹配關(guān)鍵字的字符串,則將字符串識(shí)別為關(guān)鍵字。</p><p>  設(shè)置一個(gè)字符類型和字符串輸出函數(shù)out,把從文件中讀出的字符串,以及它預(yù)定義的類型輸出,同時(shí)

7、將詞法分析的一段結(jié)果輸入到指定文件中,同時(shí)輸出到命令窗口。</p><p>  設(shè)置一個(gè)報(bào)錯(cuò)函數(shù)error,對(duì)于文件中未能夠識(shí)別的字符進(jìn)行報(bào)錯(cuò)處理,輸入報(bào)錯(cuò)信息“書寫格式錯(cuò)誤,未被識(shí)別”。</p><p>  設(shè)置功能函數(shù)function,進(jìn)行具體的詞法分析功能,不斷對(duì)文件中的字符進(jìn)行讀出,按照字符串類型進(jìn)判斷分類,調(diào)用字符串匹配函數(shù)用來識(shí)別關(guān)鍵字,調(diào)用out函數(shù),用來識(shí)別普通的常量以及標(biāo)

8、示符,同時(shí)對(duì)于界符和運(yùn)算符進(jìn)行識(shí)別,同時(shí)輸出到指定的文件中。在本函數(shù)中還設(shè)置了屏蔽注釋內(nèi)容的功能,因?yàn)樽⑨尣⒉粚?shí)際參與程序的運(yùn)行,設(shè)置屏蔽注釋內(nèi)容夫人功能,不把它反映在在此法分析的結(jié)果中。</p><p>  運(yùn)用主函數(shù),對(duì)上面設(shè)置的函數(shù)進(jìn)行調(diào)用,完成具體的詞法分析功能。</p><p><b>  F具體的程序代碼:</b></p><p>

9、  /*該語言的關(guān)鍵字 :begin end if then else for do while and or not */</p><p>  /*該語言的界符: ; , : , ( , ) , { , }等/</p><p>  /*該語言的運(yùn)算符:+,?=,-,*,>,>=,<,<=等/</p><p>  #

10、include <stdio.h></p><p>  #include <ctype.h></p><p>  #include <string.h></p><p>  #include <stdlib.h></p><p>  #define ID 12</p><p&

11、gt;  #define INT 13</p><p>  #define JF 14</p><p>  #define YSF 15</p><p>  #define N 30</p><p>  char TOKEN[N];</p><p>  FILE *write;</p><p>

12、  int looksame(char *a)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  Char*key[22]={"begin","end","if","then",&qu

13、ot;else","for","do","while","and","or","not",</p><p>  "BEGIN","END","IF","THEN","ELSE",&quo

14、t;FOR","DO","WHILE","AND","OR","NOT"};</p><p>  for(i = 0;i < 22;i++)</p><p><b>  {</b></p><p>  if(strcmp(key[

15、i],a) == 0)/*該字符串是否與關(guān)鍵字相匹配*/</p><p>  return (i%11+1);</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><

16、p>  /*本函數(shù)的意思是,查詢一個(gè)字符串,看其是否與指定的字符相匹配,如果匹配返回1個(gè)非零的值,如果不匹配,則返回一個(gè)0值*/</p><p>  void out(int a,char *b) </p><p><b>  {</b></p><p>  FILE *write; </p><p>

17、  write = fopen("E:\\b.txt","a+");</p><p>  if(write == NULL)</p><p><b>  {</b></p><p>  printf("文件打開失敗");</p><p><b>  e

18、xit(0);</b></p><p><b>  }</b></p><p>  fprintf(write,"%d\t", a); </p><p>  fwrite(b,strlen(b),1,write);</p><p>  fprintf(write,"\n"

19、;);</p><p>  fclose(write); </p><p>  printf("%d %20s\t\t",a,b);</p><p><b>  }</b></p><p>  //這個(gè)函數(shù)的意思就是吧a輸入到指定文件中,然后從該文件中讀出字符串,放到一個(gè)數(shù)組中輸出//&l

20、t;/p><p>  int error()</p><p><b>  {</b></p><p>  printf("書寫格式錯(cuò)誤,未被識(shí)別\n");</p><p><b>  return 0;</b></p><p><b>  }<

21、/b></p><p>  void function(FILE *fp)</p><p><b>  {</b></p><p>  char ch=' ';</p><p><b>  int i,c;</b></p><p>  while(ch!

22、= EOF)</p><p><b>  {</b></p><p>  ch = fgetc(fp);</p><p>  while(ch == ' ' || ch == '\t' || ch == '\n') {</p><p>  ch = fgetc

23、(fp);</p><p><b>  }</b></p><p>  if(isalpha(ch)) //isalpha()判斷是否為英文字母,是則返回非零值,否則返回零值//</p><p><b>  {</b></p><p>  TOKEN[0] = ch;</p><

24、;p>  ch = fgetc(fp);</p><p><b>  i = 1;</b></p><p>  while(isalnum(ch)) //isalnum()判斷字符是否為英文字母或數(shù)字,如果是則返 回非零值,如果不是則返回零值//</p><p>&l

25、t;b>  {</b></p><p>  TOKEN[i] = ch;</p><p><b>  i++;</b></p><p>  ch = fgetc(fp); }</p><p>  TOKEN[i] = '\0';</p><p>  f

26、seek(fp,-1,1);</p><p>  c = looksame(TOKEN);</p><p>  if(c == 0)</p><p><b>  {</b></p><p>  out(ID,TOKEN);printf("標(biāo)示符\n");</p><p><

27、;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  out(c,TOKEN);printf("關(guān)鍵字\n");</p><p><b>  }</b></p&

28、gt;<p><b>  }</b></p><p>  else if(isdigit(ch)) //isdigit()判斷是否為a0-9的數(shù)字//</p><p><b>  {</b></p><p>  TOKEN[0] = ch;</p><p>

29、;  ch = fgetc(fp);</p><p><b>  i = 1;</b></p><p>  while(isdigit(ch))</p><p><b>  {</b></p><p>  TOKEN[i] = ch;</p><p><b> 

30、 i++;</b></p><p>  ch = fgetc(fp);</p><p><b>  }</b></p><p>  TOKEN[i] = '\0';</p><p>  fseek(fp,-1,1);</p><p>  out(INT,TOKEN);&

31、lt;/p><p>  printf("常數(shù)\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  switch(ch)</p&g

32、t;<p><b>  {</b></p><p>  case'+':out(YSF,"+");printf("運(yùn)算符\n");</p><p><b>  break;</b></p><p>  case'-':out(YSF,&q

33、uot;-");printf("運(yùn)算符\n");</p><p><b>  break;</b></p><p>  case';':out(JF,";");printf("界符\n");</p><p><b>  break;</b>

34、;</p><p>  case',':out(JF,",");printf("界符\n");</p><p><b>  break;</b></p><p>  case'|':out(YSF,"|");printf("運(yùn)算符\n"

35、;);</p><p><b>  break;</b></p><p>  case'{':out(JF,"{");printf("界符\n");</p><p><b>  break;</b></p><p>  case'(&#

36、39;:out(JF,"(");printf("界符\n");</p><p><b>  break;</b></p><p>  case'!':out(JF,"!");printf("界符\n");</p><p><b>  bre

37、ak;</b></p><p>  case'^':out(JF,"^");printf("界符\n");</p><p><b>  break;</b></p><p>  case')':out(JF,")");printf("

38、;界符\n");</p><p><b>  break;</b></p><p>  case'}':out(JF,"}");printf("界符\n");</p><p><b>  break;</b></p><p>  ca

39、se'<':ch = fgetc(fp);</p><p>  if(ch== '=')</p><p><b>  {</b></p><p>  out(YSF,"<=");</p><p>  printf("運(yùn)算符\n");<

40、;/p><p><b>  }</b></p><p>  else if(ch== '>')</p><p><b>  {</b></p><p>  out(YSF,"<>");</p><p>  printf(&qu

41、ot;運(yùn)算符\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  fseek(fp,-1,1);</p><p>  out(YSF,&qu

42、ot;<");</p><p>  printf("運(yùn)算符\n");</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case'=':out(YSF,"=");pri

43、ntf("運(yùn)算符\n");</p><p><b>  break;</b></p><p>  case'>':ch = fgetc(fp);</p><p>  if(ch == '=')</p><p><b>  {</b></

44、p><p>  out(YSF,">=");</p><p>  printf("運(yùn)算符\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {<

45、/b></p><p>  fseek(fp,-1,1);</p><p>  out(YSF,">");</p><p>  printf("運(yùn)算符\n");</p><p><b>  }</b></p><p><b>  bre

46、ak;</b></p><p>  case':':ch = fgetc(fp);</p><p>  if(ch == '=')</p><p><b>  {</b></p><p>  out(YSF,":=");</p><p&g

47、t;  printf("運(yùn)算符\n");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  fseek(fp,-1,1);</p><p>

48、;  out(JF,":");</p><p>  printf("界符\n");</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case'/':ch = fgetc(fp);&l

49、t;/p><p>  if(ch == '*')</p><p><b>  {</b></p><p>  out(JF,"/*");</p><p>  printf("界符\n");</p><p>  while(1) /

50、/ 注釋的內(nèi)容不反應(yīng)在詞法分析中// {</p><p>  while(ch != '/')</p><p>  ch = fgetc(fp);</p><p>  fseek(fp, -2, 1);</p><p>  ch = fgetc(fp);</p><p>  i

51、f(ch == '*')</p><p><b>  {</b></p><p>  fseek(fp, 1, 1);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b&

52、gt;  else</b></p><p><b>  {</b></p><p>  fseek(fp, 2, 1);</p><p>  ch = fgetc(fp);</p><p><b>  }</b></p><p><b>  }</

53、b></p><p>  fseek(fp, -2, 1);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  fseek(fp,-1,1);</

54、p><p>  out(JF,"/");</p><p>  printf("界符\n");</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case'*':ch

55、 = fgetc(fp);</p><p>  if(ch == '/')</p><p><b>  {</b></p><p>  out(JF,"*/");</p><p>  printf("界符\n");</p><p><b

56、>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  fseek(fp,-1,1);</p><p>  out(YSF,"*");</p><p>  printf(

57、"運(yùn)算符\n");</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case EOF:break;</p><p>  default:error();</p><p><b>  b

58、reak;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int main()

59、</p><p><b>  {</b></p><p>  FILE *read;</p><p>  read = fopen("E:\\a.txt","r");</p><p>  write = fopen("E:\\b.txt","a+&qu

60、ot;);</p><p>  if(read == NULL)</p><p><b>  {</b></p><p>  printf("FILE OPEN FAIL!");//</p><p><b>  exit(0);</b></p><p>&

61、lt;b>  } </b></p><p>  printf("===========================================================\n");</p><p>  printf("====================詞法分析程序===========================\n&q

62、uot;);</p><p>  printf("===========該分析程序的文件存放在D:\\a.txt目錄下==========\n");</p><p>  printf("===========該程序的分析結(jié)果存放在D:\\b.txt目錄下===========\n");</p><p>  printf(&qu

63、ot;============================================================\n");</p><p>  function(read);</p><p>  fclose(read);</p><p>  system("pause");</p><p><

64、;b>  return 0;</b></p><p><b>  }</b></p><p>  G,文件說明,程序中運(yùn)用的兩個(gè)文件存放在E盤中,文件名為a和b。</p><p><b>  文件a的內(nèi)容為:</b></p><p><b>  程序運(yùn)行的結(jié)果為:<

65、/b></p><p>  文件b在執(zhí)行后的內(nèi)容變?yōu)椋?lt;/p><p><b>  實(shí)驗(yàn)心得體會(huì):</b></p><p>  這次課程設(shè)計(jì)頻繁的使用了C語言中的文件操作函數(shù),對(duì)這方面的知識(shí)有了更加深刻的了解,在設(shè)計(jì)過程中,對(duì)各種函數(shù)的使用也更加熟練,與此同時(shí)對(duì)編譯原理中詞法分析的功能有了更加深刻的了解和認(rèn)識(shí)。由于自己時(shí)間的原因,選擇了一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論