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

下載本文檔

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

文檔簡介

1、<p><b>  摘要</b></p><p>  使用過現(xiàn)代計(jì)算機(jī)的人都知道,多數(shù)用戶是應(yīng)用高級語言來實(shí)現(xiàn)他們所需要的計(jì)算的?,F(xiàn)在計(jì)算機(jī)系統(tǒng)一般都含有不只一個(gè)的高級語言的編譯程序,對有些高級語言甚至配置了幾個(gè)不同性能的編譯程序,供用戶按不同需要進(jìn)行選擇。高級語言編譯程序是計(jì)算機(jī)系統(tǒng)軟件最主要的組成部分之一,也是用戶最直接關(guān)系的工具之一。</p><p>

2、  計(jì)算機(jī)上執(zhí)行一個(gè)高級語言程序一般分為兩步:第一,用一個(gè)編譯程序把高級語言翻譯成機(jī)器語言程序;第二,運(yùn)行所得的機(jī)器語言程序求得計(jì)算結(jié)果。</p><p>  通常說的翻譯程序是指能夠把某一種語言程序轉(zhuǎn)換成另一種語言程序(目標(biāo)語言程序)。如果源語言諸如Fortran,Pascal,C,Ada或java這樣的高級語言,而目標(biāo)程序是諸如匯編語言或者機(jī)器語言這類的低級語言,這樣的一個(gè)翻譯程序就是稱為編譯程序。</

3、p><p>  一個(gè)編譯程序的工作過程一般可以劃分為五個(gè)階段:詞法分析、語法分析、語義分析與中間代碼生成、優(yōu)化、目標(biāo)代碼生成。每個(gè)階段都是從上一個(gè)階段得到結(jié)果,對他進(jìn)行分析,并且根據(jù)一些外部環(huán)境(例如符號(hào)表等)得到最終的輸出結(jié)果。要構(gòu)造一個(gè)編譯程序,可以按照這樣的階段來分別構(gòu)造,最后來連調(diào)。</p><p>  現(xiàn)在人們已經(jīng)建立了多種編制部分編譯程序或整個(gè)編譯程序的有效工具。有些能用于自動(dòng)生成

4、掃描器(如LEX),有些可以用于自動(dòng)產(chǎn)生語法分析器(如YACC),有些甚至可以用來自動(dòng)產(chǎn)生整個(gè)的編譯程序。這些構(gòu)造編譯程序的工具成為編譯程序-編譯程序、編譯程序產(chǎn)生器或翻譯程序書寫系統(tǒng),他們是按照編譯程序和目標(biāo)語言的形式描述而自動(dòng)產(chǎn)生編譯程序的。</p><p>  編譯程序是一極其龐大而又復(fù)雜的系統(tǒng),掌握它比較苦難。但是一旦對其掌握,對以后的程序語言設(shè)計(jì),系統(tǒng)軟件分析,系統(tǒng)軟件設(shè)計(jì),形式語言研究等方面都是非常有

5、好處的。</p><p>  關(guān)鍵字:C語言、、編譯、掃描器、語法分析</p><p><b>  一、需求分析</b></p><p>  給出類C語言(C語言的子集)的詞法和語法定義,并根據(jù)對應(yīng)的語法定義寫出一些屬性文法和語法制導(dǎo)。根據(jù)詞法和語法的定義,構(gòu)造一個(gè)編譯程序,它主要可以完成如下功能:</p><p>  

6、1、讀入某個(gè)已經(jīng)編輯好的類C源程序文件,通過詞法分析器,生成二元組,同時(shí)檢查詞法錯(cuò)誤;</p><p>  2、語法分析器將產(chǎn)生的二元組作為輸入,進(jìn)行語法分析,同時(shí)檢查語法錯(cuò)誤;</p><p>  3、在語法分析同時(shí),利用屬性文法和語法制導(dǎo)技術(shù),產(chǎn)生具體的語意動(dòng)作,并對符號(hào)表進(jìn)行操作;</p><p>  4、根據(jù)語義動(dòng)作產(chǎn)生整個(gè)源程序的四元式序列;</p&

7、gt;<p>  5、將產(chǎn)生的四元式序列連同符號(hào)表一起輸出,作為編譯程序的最終輸出結(jié)果;</p><p>  6、對最后的代碼優(yōu)化和目標(biāo)代碼生成要有所考慮,必須留有一定的接口供以后擴(kuò)展;</p><p>  7、增大程序的可移植性,努力做到整個(gè)系統(tǒng)方便移植。</p><p><b>  二、詳細(xì)算法設(shè)計(jì)</b></p>

8、<p>  詞法分析程序 語法分析程序 語義分析程序 編譯器。</p><p><b>  三、流程圖</b></p><p>  圖 I 主函數(shù)示意圖</p><p>  圖 II 遞歸下降分析程序示意圖</p><p>  圖 IV 語句串分析示意圖</p><p>  圖

9、V 語句分析示意圖</p><p><b>  四、相關(guān)函數(shù)說明</b></p><p>  void scanner(); //掃描</p><p>  void lrparser(); </p><p>  void staBlock(int *nChain); //語句塊</p><p> 

10、 void staString(int *nChain); //語句串</p><p>  void sta(int *nChain); //語句</p><p>  void fuzhi(); //賦值語句</p><p>  void tiaojian(int *nChain); //條件語句</p><p>  void xunhuan

11、(); //循環(huán)語句</p><p>  char* E(); //Expresiion表達(dá)式</p><p>  char* T(); //Term項(xiàng)</p><p>  char* F(); //Factor因子</p><p>  char *newTemp(); //自動(dòng)生成臨時(shí)變量</p><p>  voi

12、d backpatch(int p,int t); //回填</p><p>  int merge(int p1,int p2); //合并p1和p2</p><p>  void emit(char *res,char *num1,char *op,char *num2); //生成四元式</p><p><b>  五.運(yùn)行結(jié)果 </b&g

13、t;</p><p>  圖 VI 賦值語句的分析</p><p>  圖 VII 條件語句的分析</p><p>  圖 VIII 循環(huán)語句的分析</p><p><b>  圖 IX 綜合</b></p><p><b>  六.編譯器使用說明</b></p>

14、<p>  程序提示用戶輸入字符串“Please input your source string:”,用戶輸入字符串并以“#”號(hào)結(jié)束?;剀嚭?,程序顯示運(yùn)行結(jié)果。</p><p><b>  七.程序清單</b></p><p>  #include<stdio.h></p><p>  #include<str

15、ing.h></p><p>  #include<math.h></p><p>  #include<stdlib.h></p><p>  char prog[80]; /* 存放所有輸入字符 */</p><p>  char token[8]; /* 存放詞組 */</p>&

16、lt;p>  char ch; /* 單個(gè)字符 */</p><p>  int syn,p,m,n,i; /* syn:種別編碼 */</p><p>  double sum; </p><p>  int count; </p><p>  int isSignal; /* 是否帶正負(fù)號(hào)(0不帶,1

17、負(fù)號(hào),2正號(hào)) */</p><p>  int isError;</p><p>  int isDecimal; /* 是否是小數(shù) */</p><p>  double decimal; /* 小數(shù) */</p><p>  int isExp; /* 是否是指數(shù) */</p><p>  

18、int index; /* 指數(shù)冪 */</p><p>  int isNegative; /* 是否帶負(fù)號(hào) */</p><p>  double temp; </p><p>  int temp2;</p><p>  int repeat; /* 是否連續(xù)出現(xiàn)+,- */</p><p>  

19、int nextq;</p><p>  int kk; /* 臨時(shí)變量的標(biāo)號(hào) */</p><p>  int ntc,nfc,nnc,nnb,nna;</p><p>  char *rwtab[9]={"main","int","float","double","char

20、","if","else","do","while"};</p><p><b>  struct{</b></p><p>  char result[10]; /* 字符串(字符數(shù)組) */</p><p>  char arg1[10];</p

21、><p>  char opera[10];</p><p>  char arg2[10];</p><p>  }fourCom[20]; /* 結(jié)構(gòu)體數(shù)組 */</p><p>  void scanner(); /* 掃描 */</p><p>  void lrparser(); </p><

22、p>  void staBlock(int *nChain); /* 語句塊 */</p><p>  void staString(int *nChain); /* 語句串 */</p><p>  void sta(int *nChain); /* 語句 */</p><p>  void fuzhi(); /* 賦值語句 */</p>&l

23、t;p>  void tiaojian(int *nChain); /* 條件語句 */</p><p>  void xunhuan(); /* 循環(huán)語句 */</p><p>  char* E(); /* Expresiion表達(dá)式 */</p><p>  char* T(); /* Term項(xiàng) */</p><p>  cha

24、r* F(); /* Factor因子 */</p><p>  char *newTemp(); /* 自動(dòng)生成臨時(shí)變量 */</p><p>  void backpatch(int p,int t); /* 回填 */</p><p>  int merge(int p1,int p2); /* 合并p1和p2 */</p><p> 

25、 void emit(char *res,char *num1,char *op,char *num2); /* 生成四元式 */</p><p>  void main()</p><p><b>  { p=0;</b></p><p><b>  count=0;</b></p><p>

26、  isDecimal=0;</p><p><b>  index=0;</b></p><p><b>  repeat=0;</b></p><p><b>  kk=0;</b></p><p>  printf("\nPlease input your so

27、urce string:\n");</p><p>  do{ch=getchar();</p><p>  prog[p++]=ch;</p><p>  }while(ch!='#');</p><p><b>  p=0;</b></p><p>  isError

28、=0;</p><p>  scanner();</p><p>  lrparser();</p><p>  for(i=1;i<nextq;i++) /* 循環(huán)輸出四元式 */</p><p>  {printf("\n%d\t",i);</p><p>  printf("(

29、%5s %5s %5s \t%5s )\n",fourCom[i].arg1,fourCom[i].opera,fourCom[i].arg2,fourCom[i].result);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void lrparser

30、()</p><p><b>  {</b></p><p>  int nChain;</p><p>  nfc=ntc=1;</p><p><b>  nextq=1;</b></p><p>  if(syn==1) /* main */</p>&l

31、t;p><b>  {</b></p><p>  scanner();</p><p>  if(syn==26) /* ( */</p><p>  { scanner();</p><p>  if(syn==27) /* ) */</p><p>  { scanner();

32、</p><p>  staBlock(&nChain);</p><p><b>  }</b></p><p><b>  else</b></p><p>  printf("缺少右括號(hào)\n");</p><p><b>  }&l

33、t;/b></p><p><b>  else </b></p><p>  printf("缺少左括號(hào)\n");</p><p><b>  }</b></p><p><b>  else</b></p><p>  pr

34、intf("缺少main\n");</p><p>  }/* <語句塊> ::= '{'<語句串>'}' */</p><p>  void staBlock(int *nChain) /* 語句塊 */</p><p>  { if(syn==28) /* { */</p&g

35、t;<p><b>  {</b></p><p>  scanner();</p><p>  staString(nChain);</p><p>  /* backpatch(*nChain,nextq); */</p><p>  if(syn==29) /* } */</p><

36、;p>  scanner(); /* 讀下一個(gè) */</p><p><b>  else</b></p><p>  printf("缺少}號(hào)\n");</p><p><b>  }</b></p><p><b>  else</b></

37、p><p>  printf("缺少{號(hào)\n");</p><p><b>  }</b></p><p>  /* <語句串>::=<語句>{;<語句>}; */</p><p>  void staString(int *nChain) /* 語句串 */</

38、p><p><b>  {</b></p><p>  sta(nChain);</p><p>  backpatch(*nChain,nextq);</p><p>  while(syn==31) /* ; */</p><p><b>  {</b></p>

39、<p>  scanner();</p><p>  sta(nChain);</p><p><b>  }</b></p><p>  /* backpatch(*nChain,nextq-1); */</p><p><b>  }</b></p><p>

40、  void sta(int *nChain) /* 語句 */</p><p><b>  {</b></p><p>  if(syn==10)</p><p><b>  {</b></p><p><b>  fuzhi();</b></p><p&

41、gt;  /* *nChain=0; */</p><p><b>  }</b></p><p>  else if(syn==6) /* if */</p><p><b>  {</b></p><p>  tiaojian(nChain);</p><p><b

42、>  }</b></p><p>  else if(syn==8) /* do */</p><p>  xunhuan();</p><p><b>  }</b></p><p>  /* <條件語句>->if(<條件>)<語句塊> */</p>

43、;<p>  void tiaojian(int *nChain)</p><p><b>  {</b></p><p>  char res[10],num1[10],num2[10],op[10];</p><p>  int nChainTemp;</p><p>  /* <條件>-&

44、gt;<表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式> */</p><p>  if(syn==6) /* if */</p><p><b>  {</b></p><p>  scanner();</p><p>  /* strcpy(num1,E()); */</p><

45、;p>  if(syn==26) /* ( */</p><p><b>  {</b></p><p>  scanner();</p><p>  strcpy(num1,E());</p><p>  if((syn<=37)&&(syn>=32)) </p><

46、;p><b>  {</b></p><p>  switch(syn)</p><p><b>  {</b></p><p><b>  case 32:</b></p><p>  strcpy(op,">");</p>&l

47、t;p><b>  break;</b></p><p><b>  case 33:</b></p><p>  strcpy(op,">=");</p><p><b>  break;</b></p><p><b>  case

48、 34:</b></p><p>  strcpy(op,"<");</p><p><b>  break;</b></p><p><b>  case 35:</b></p><p>  strcpy(op,"<=");</

49、p><p><b>  break;</b></p><p><b>  case 36:</b></p><p>  strcpy(op,"==");</p><p><b>  break;</b></p><p><b>

50、  case 37:</b></p><p>  strcpy(op,"!=");</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  printf("error");<

51、/p><p><b>  }</b></p><p><b>  }</b></p><p>  scanner();</p><p>  strcpy(num2,E());</p><p>  strcat(num1,op);</p><p>  str

52、cat(num1,num2);</p><p>  /* nfc=nextq+1; */</p><p>  ntc=nextq; /* 記住if語句位置 */</p><p>  emit("0","if",num1,"goto"); </p><p>  nfc=nextq; /

53、* if中表達(dá)式為假 */</p><p>  emit("0","","","goto");</p><p>  /* 第一個(gè)0已回填 */</p><p>  backpatch(ntc,nextq); /* ntc鏈接的所有四元式都回填nextq */</p><

54、;p><b>  } </b></p><p>  if(syn==27) /* ) */</p><p>  scanner();</p><p>  staBlock(&nChainTemp); /* 語句塊 */</p><p>  *nChain=merge(nChainTemp,nfc);

55、</p><p><b>  }</b></p><p><b>  }</b></p><p>  /* <循環(huán)語句>::=do <語句塊>while <條件> */</p><p>  void xunhuan()</p><p>&l

56、t;b>  {</b></p><p>  char res[10],num1[10],num2[10],op[10];</p><p>  int nChainTemp;</p><p>  if(syn==8) /* do */</p><p><b>  {</b></p><

57、p>  nnc=nextq; /* 記住if語句位置,emit之后nextq就變了 */</p><p>  /* emit("0","if",num1,"goto"); */</p><p>  scanner();</p><p>  staBlock(&nChainTemp); /*

58、語句塊 */</p><p>  if(syn==9) /* while */</p><p><b>  {</b></p><p>  scanner();</p><p>  if(syn==26) /* ( */</p><p><b>  {</b></p&g

59、t;<p>  scanner();</p><p>  strcpy(num1,E());</p><p>  if((syn<=37)&&(syn>=32)) </p><p><b>  {</b></p><p>  switch(syn)</p><

60、p><b>  {</b></p><p><b>  case 32:</b></p><p>  strcpy(op,">");</p><p><b>  break;</b></p><p><b>  case 33:<

61、/b></p><p>  strcpy(op,">=");</p><p><b>  break;</b></p><p><b>  case 34:</b></p><p>  strcpy(op,"<");</p>&

62、lt;p><b>  break;</b></p><p><b>  case 35:</b></p><p>  strcpy(op,"<=");</p><p><b>  break;</b></p><p><b>  cas

63、e 36:</b></p><p>  strcpy(op,"==");</p><p><b>  break;</b></p><p><b>  case 37:</b></p><p>  strcpy(op,"!=");</p>

64、;<p><b>  break;</b></p><p><b>  default:</b></p><p>  printf("error");</p><p><b>  }</b></p><p><b>  }</b

65、></p><p>  scanner();</p><p>  strcpy(num2,E());</p><p>  strcat(num1,op);</p><p>  strcat(num1,num2);</p><p>  nnb=nextq;</p><p>  emit(&q

66、uot;0","if",num1,"goto"); </p><p>  backpatch(nnb,nnc);</p><p>  nna=nextq;</p><p>  emit("0","","","goto");</p&g

67、t;<p>  backpatch(nna,nextq);</p><p><b>  }</b></p><p>  if(syn==27) /* ) */</p><p>  scanner();</p><p><b>  }</b></p><p>&

68、lt;b>  }</b></p><p><b>  }</b></p><p>  void fuzhi() /* 賦值語句只有1個(gè)操作數(shù) */</p><p><b>  {</b></p><p>  char res[10],num[10]; /* num操作數(shù) */<

69、;/p><p>  if(syn==10) /* 字符串 */</p><p><b>  {</b></p><p>  strcpy(res,token); /* 結(jié)果 */</p><p>  scanner();</p><p>  if(syn==21) /* = */</p>

70、<p><b>  {</b></p><p>  scanner();</p><p>  strcpy(num,E());</p><p>  emit(res,num,"=","");</p><p><b>  }</b></p>

71、;<p><b>  else</b></p><p><b>  {</b></p><p>  printf("缺少=號(hào)\n");</p><p><b>  }</b></p><p><b>  }</b><

72、/p><p><b>  }</b></p><p>  char* E() /* Expression表達(dá)式 */</p><p><b>  {</b></p><p>  char *res,*num1,*op,*num2;</p><p>  res=(char *)ma

73、lloc(10);</p><p>  num1=(char *)malloc(10); </p><p>  op=(char *)malloc(10);</p><p>  num2=(char *)malloc(10);</p><p>  strcpy(num1,T());</p><p>  while

74、((syn==22)||(syn==23)) /* + - */</p><p><b>  {</b></p><p>  if(syn==22) /* + */</p><p>  strcpy(op,"+");</p><p><b>  else</b></p>

75、;<p>  strcpy(op,"-");</p><p>  scanner();</p><p>  strcpy(num2,T());</p><p>  strcpy(res,newTemp());</p><p>  emit(res,num1,op,num2);</p><p

76、>  strcpy(num1,res);</p><p><b>  }</b></p><p>  return num1;</p><p><b>  }</b></p><p>  char* T() /* Term項(xiàng) */</p><p><b>  

77、{</b></p><p>  char *res,*num1,*op,*num2;</p><p>  res=(char *)malloc(10);</p><p>  num1=(char *)malloc(10);</p><p>  op=(char *)malloc(10);</p><p> 

78、 num2=(char *)malloc(10);</p><p>  strcpy(num1,F());</p><p>  while((syn==24)||(syn==25)) /* * / */</p><p><b>  {</b></p><p>  if(syn==24) </p><p

79、>  strcpy(op,"*");</p><p><b>  else</b></p><p>  strcpy(op,"/");</p><p>  scanner();</p><p>  strcpy(num2,F());</p><p> 

80、 strcpy(res,newTemp());</p><p>  emit(res,num1,op,num2);</p><p>  strcpy(num1,res);</p><p><b>  }</b></p><p>  return num1;</p><p><b>  }

81、</b></p><p>  char* F() /* Factor因子 */</p><p><b>  {</b></p><p>  char *res;</p><p>  res=(char *)malloc(10);</p><p>  if(syn==10) /* 字符串

82、 */</p><p><b>  {</b></p><p>  strcpy(res,token);</p><p>  scanner();</p><p><b>  }</b></p><p>  else if(syn==20) /* 二進(jìn)制數(shù) */</p&

83、gt;<p><b>  {</b></p><p>  itoa((int)sum,res,10); /* 整數(shù)轉(zhuǎn)換為字符串 */</p><p>  scanner();</p><p><b>  }</b></p><p>  else if(syn==26) /* ( */&

84、lt;/p><p><b>  {</b></p><p>  scanner();</p><p><b>  res=E();</b></p><p>  if(syn==27) /* ) */</p><p><b>  {</b></p>

85、<p>  scanner();</p><p><b>  }</b></p><p>  else isError=1;</p><p><b>  }</b></p><p><b>  else</b></p><p>  isEr

86、ror=1;</p><p>  return res;</p><p><b>  }</b></p><p>  char *newTemp()</p><p><b>  {</b></p><p><b>  char *p;</b></p

87、><p>  char varTemp[10];</p><p>  p=(char *)malloc(10);</p><p><b>  kk++;</b></p><p>  itoa(kk,varTemp,10);</p><p>  strcpy(p+1,varTemp);</p>

88、;<p><b>  p[0]='T';</b></p><p><b>  return p;</b></p><p><b>  }</b></p><p>  /* 將p所鏈接的每個(gè)四元式的第四個(gè)分量都回填t */</p><p>  voi

89、d backpatch(int p,int t) </p><p><b>  {</b></p><p>  int w,circle=p;</p><p>  while(circle) /* circle不為0的時(shí)候 */</p><p><b>  {</b></p><

90、p>  w=atoi(fourCom[circle].result); /* 四元式circle第四分量內(nèi)容 */</p><p>  /* strcpy(fourCom[circle].result,t); //把t填進(jìn)四元式circle的第四分量 */</p><p>  sprintf(fourCom[circle].result,"%d",t);</

91、p><p>  circle=w; /* w記錄的是鏈條上下一個(gè)四元式,移動(dòng)! */</p><p><b>  } return;</b></p><p><b>  }</b></p><p>  int merge(int p1,int p2) /* 合并p1和p2 */</p>&

92、lt;p><b>  {</b></p><p>  char circle,nResult;</p><p><b>  if(p2==0)</b></p><p>  nResult=p1;</p><p><b>  else</b></p><

93、p><b>  {</b></p><p>  nResult=circle=p2;</p><p>  while(atoi(fourCom[circle].result)) /* 四元式第四個(gè)分量不為0 */</p><p><b>  {</b></p><p>  circle=ato

94、i(fourCom[circle].result); </p><p>  /* strcpy(fourCom[circle].result,p1); */</p><p>  sprintf(fourCom[circle].result,"%s",p1);</p><p>  } /* 目的是用p1的值覆蓋0 */</p>&l

95、t;p><b>  }</b></p><p>  return nResult; /* p2是頭,p1覆蓋0,接在p2后邊 */</p><p><b>  }</b></p><p>  void emit(char *res,char *num1,char *op,char *num2)</p>

96、<p><b>  {</b></p><p>  strcpy(fourCom[nextq].result,res);</p><p>  strcpy(fourCom[nextq].arg1,num1);</p><p>  strcpy(fourCom[nextq].opera,op);</p><p>

97、  strcpy(fourCom[nextq].arg2,num2);</p><p><b>  nextq++;</b></p><p><b>  }</b></p><p>  void scanner() </p><p><b>  { </b></p

98、><p><b>  sum=0; </b></p><p>  decimal=0; </p><p><b>  m=0; </b></p><p>  for(n=0;n<8;n++) </p><p>  token[n]=NULL; </

99、p><p>  ch=prog[p++]; /* 從prog中讀出一個(gè)字符到ch中 */</p><p>  while(ch==' '||ch=='\n') /* 跳過空字符(無效輸入) */</p><p>  ch=prog[p++]; </p><p>  if(((ch>='

100、;a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))) /* ch是字母字符 */</p><p><b>  { </b></p><p>  while(((ch>='a')&&(ch

101、<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')&&(ch<='9'))) </p><p><b>  { </b></p><p>  token[m++]=ch; /* ch=

102、>token */</p><p>  ch=prog[p++]; /* 讀下一個(gè)字符 */</p><p><b>  } </b></p><p>  token[m++]='\0'; </p><p>  p--; /* 回退一格 */</p><

103、p>  syn=10; /* 標(biāo)識(shí)符 */</p><p>  /* 如果是"begin","if","then","while","do","end"標(biāo)識(shí)符中的一個(gè) */</p><p>  for(n=0;n<9;n++) </p&g

104、t;<p>  if(strcmp(token,rwtab[n])==0) </p><p><b>  { </b></p><p>  syn=n+1; </p><p><b>  break; </b></p><p><b>  } </b

105、></p><p><b>  } </b></p><p>  else if((ch>='0')&&(ch<='9')) </p><p><b>  { </b></p><p><b>  IsNum:&

106、lt;/b></p><p>  if(isSignal==1)</p><p><b>  {</b></p><p>  /* token[m++]='-'; */</p><p><b>  }</b></p><p>  while((ch>

107、;='0')&&(ch<='9')) </p><p><b>  { </b></p><p>  sum=sum*10+ch-'0'; /* ch中數(shù)字本身是當(dāng)做字符存放的 */</p><p>  ch=prog[p++]; </p>&

108、lt;p><b>  } </b></p><p>  if(ch=='.') </p><p><b>  { </b></p><p>  isDecimal=1; </p><p>  ch=prog[p++]; </p><p&g

109、t;  count=0; /* 之前忘了清零,123.123+123.123#兩個(gè)浮點(diǎn)數(shù)就無法識(shí)別 */</p><p>  while((ch>='0')&&(ch<='9')) </p><p><b>  { </b></p><p>  /* pow(x,y)計(jì)算x的y

110、次冪 */</p><p>  temp=(ch-'0')*pow(0.1,++count); </p><p>  decimal=decimal+temp; </p><p>  /* AddToDec(); */</p><p>  ch=prog[p++]; </p><p&

111、gt;<b>  } </b></p><p>  sum=sum+decimal; </p><p><b>  } </b></p><p>  if(ch=='e'||ch=='E') </p><p><b>  { </b

112、></p><p>  isExp=1; </p><p>  ch=prog[p++]; </p><p>  if(ch=='-') </p><p><b>  { </b></p><p>  isNegative=1; </p>&

113、lt;p>  ch=prog[p++]; </p><p><b>  } </b></p><p>  while((ch>='0')&&(ch<='9')) </p><p><b>  { </b></p><p&g

114、t;  /* 指數(shù) */</p><p>  index=index*10+ch-'0'; </p><p>  ch=prog[p++]; </p><p><b>  } </b></p><p>  /* 10的冪 */</p><p>  /* 12

115、3e3代表123*10(3) */</p><p>  /* sum=sum*pow(10,index);是錯(cuò)誤的 */</p><p>  if(isNegative) </p><p>  sum=sum*pow(0.1,index); </p><p><b>  else </b></

116、p><p>  sum=sum*pow(10,index); </p><p><b>  } </b></p><p>  if(isSignal==1)</p><p><b>  {</b></p><p><b>  sum=-sum;</b>

117、;</p><p>  isSignal=0;</p><p><b>  }</b></p><p><b>  p--; </b></p><p>  syn=20; </p><p><b>  } </b></p>&l

118、t;p>  else switch(ch) </p><p><b>  { </b></p><p>  case '<': </p><p><b>  m=0; </b></p><p>  token[m++]=ch; </p>

119、<p>  ch=prog[p++]; </p><p>  if(ch=='=') </p><p><b>  { </b></p><p>  syn=35; </p><p>  token[m++]=ch; </p><p><b&g

120、t;  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  syn=34; </p><p><b>  p--; </b></p><p><b

121、>  } </b></p><p><b>  break; </b></p><p>  case '>': </p><p><b>  m=0; </b></p><p>  token[m++]=ch; </p>&l

122、t;p>  ch=prog[p++]; </p><p>  if(ch=='=') </p><p><b>  { </b></p><p>  syn=33; </p><p>  token[m++]=ch; </p><p><b> 

123、 } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  syn=32; </p><p><b>  p--; </b></p><p><b>

124、;  } </b></p><p><b>  break; </b></p><p>  case '=': </p><p><b>  m=0; </b></p><p>  token[m++]=ch; </p><p>

125、;  ch=prog[p++]; </p><p>  if(ch=='=') </p><p><b>  { </b></p><p>  syn=36; </p><p>  token[m++]=ch; </p><p><b>  } &

126、lt;/b></p><p><b>  else </b></p><p><b>  { </b></p><p>  syn=21; </p><p><b>  p--; </b></p><p><b>  }

127、 </b></p><p><b>  break; </b></p><p><b>  case '+':</b></p><p>  temp2=prog[p];</p><p>  token[m++]=ch;</p><p>  if

128、((temp2>='0')&&(temp2<='9')&&(repeat==1))</p><p><b>  {</b></p><p>  isSignal=2;</p><p>  ch=prog[p++];</p><p><b&g

129、t;  repeat=0;</b></p><p>  goto IsNum;</p><p><b>  }</b></p><p>  if(((temp2=='+')||(temp2=='-'))&&(repeat==0)) /* 如果重復(fù)出現(xiàn)符號(hào),才將后邊的+,-視為正負(fù)號(hào)

130、*/</p><p><b>  {</b></p><p><b>  repeat=1;</b></p><p>  /* ch=prog[p++]; */</p><p><b>  }</b></p><p><b>  syn=22;

131、</b></p><p><b>  break;</b></p><p><b>  case '-':</b></p><p>  temp2=prog[p];</p><p>  token[m++]=ch;</p><p>  if((te

132、mp2>='0')&&(temp2<='9')&&(repeat==1))</p><p><b>  {</b></p><p>  isSignal=1;</p><p>  ch=prog[p++]; /* 讀"-"下一個(gè)字符 */</p

133、><p><b>  repeat=0;</b></p><p>  goto IsNum; /* 轉(zhuǎn)到數(shù)字的識(shí)別 */</p><p><b>  }</b></p><p>  if(((temp2=='+')||(temp2=='-'))&&(re

134、peat==0)) /* 如果重復(fù)出現(xiàn)符號(hào),才將后邊的+,-視為正負(fù)號(hào) */</p><p><b>  {</b></p><p>  repeat=1; /* 預(yù)言會(huì)重復(fù) */</p><p>  /* ch=prog[p++]; //讀下一個(gè)字符 */</p><p><b>  }</b&g

135、t;</p><p><b>  syn=23;</b></p><p><b>  break; </b></p><p><b>  case '*':</b></p><p>  temp2=prog[p];</p><p>  t

136、oken[m++]=ch;</p><p>  if(temp2=='+')</p><p><b>  {</b></p><p>  isSignal=2;</p><p><b>  repeat=1;</b></p><p><b>  }&

137、lt;/b></p><p>  else if(temp2=='-')</p><p><b>  {</b></p><p>  isSignal=1;</p><p><b>  repeat=1;</b></p><p><b>  }

138、</b></p><p><b>  syn=24;</b></p><p><b>  break;</b></p><p>  case '/': </p><p>  syn=25; </p><p>  token[m++]=ch;

139、 </p><p>  break; </p><p><b>  case '(':</b></p><p>  temp2=prog[p];</p><p>  token[m++]=ch;</p><p>  if(temp2=='+')</p

140、><p><b>  {</b></p><p>  isSignal=2;</p><p><b>  repeat=1;</b></p><p><b>  }</b></p><p>  else if(temp2=='-')</

141、p><p><b>  {</b></p><p>  isSignal=1;</p><p><b>  repeat=1;</b></p><p><b>  }</b></p><p><b>  syn=26;</b></

142、p><p><b>  break;</b></p><p>  case ')': </p><p>  syn=27; </p><p>  token[m++]=ch; </p><p><b>  break; </b></p>

143、<p>  case '{': </p><p>  syn=28; </p><p>  token[m++]=ch; </p><p><b>  break; </b></p><p>  case '}': </p><p>

144、;  syn=29; </p><p>  token[m++]=ch; </p><p><b>  break; </b></p><p>  case ',': </p><p>  syn=30; </p><p>  token[m++]=ch; &

145、lt;/p><p><b>  break; </b></p><p>  case ';': </p><p>  syn=31; </p><p>  token[m++]=ch; </p><p><b>  break; </b></

146、p><p>  case'#': </p><p><b>  syn=0; </b></p><p>  token[m++]=ch; </p><p><b>  break; </b></p><p>  default: </p&

147、gt;<p>  syn=-1; </p><p><b>  }</b></p><p><b>  getch();</b></p><p><b>  }</b></p><p><b>  八、總結(jié)</b></p>

溫馨提示

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

最新文檔

評論

0/150

提交評論