編譯原理課程設計--- 詞法分析程序_第1頁
已閱讀1頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、t;p>  學號 : ************ </p><p>  日期 : 2011-12-30 </p><p><b>  詞法分析程序設計</b></p><p><b>  課程設計目的:</b></p><p>  運用所學習的知識和語言,設計編

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

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

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

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

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

8、示符,同時對于界符和運算符進行識別,同時輸出到指定的文件中。在本函數(shù)中還設置了屏蔽注釋內容的功能,因為注釋并不實際參與程序的運行,設置屏蔽注釋內容夫人功能,不把它反映在在此法分析的結果中。</p><p>  運用主函數(shù),對上面設置的函數(shù)進行調用,完成具體的詞法分析功能。</p><p><b>  F具體的程序代碼:</b></p><p>

9、  /*該語言的關鍵字 :begin end if then else for do while and or not */</p><p>  /*該語言的界符: ; , : , ( , ) , { , }等/</p><p>  /*該語言的運算符:+,?=,-,*,>,>=,<,<=等/</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)/*該字符串是否與關鍵字相匹配*/</p><p>  return (i%11+1);</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><

16、p>  /*本函數(shù)的意思是,查詢一個字符串,看其是否與指定的字符相匹配,如果匹配返回1個非零的值,如果不匹配,則返回一個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>  //這個函數(shù)的意思就是吧a輸入到指定文件中,然后從該文件中讀出字符串,放到一個數(shù)組中輸出//&l

20、t;/p><p>  int error()</p><p><b>  {</b></p><p>  printf("書寫格式錯誤,未被識別\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("標示符\n");</p><p><

27、;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  out(c,TOKEN);printf("關鍵字\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("運算符\n");</p><p><b>  break;</b></p><p>  case'-':out(YSF,&q

33、uot;-");printf("運算符\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("運算符\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("運算符\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;運算符\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("運算符\n");</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case'=':out(YSF,"=");pri

43、ntf("運算符\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("運算符\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("運算符\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("運算符\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、/ 注釋的內容不反應在詞法分析中// {</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、"運算符\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("===========該程序的分析結果存放在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,文件說明,程序中運用的兩個文件存放在E盤中,文件名為a和b。</p><p><b>  文件a的內容為:</b></p><p><b>  程序運行的結果為:<

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

溫馨提示

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

評論

0/150

提交評論