編譯原理課程設(shè)計(jì)報告_編譯器_第1頁
已閱讀1頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目錄</b></p><p><b>  一、課設(shè)要求3</b></p><p>  二、總體設(shè)計(jì)思想4</p><p>  三、詳細(xì)算法設(shè)計(jì)4</p><p><b>  四、流程框圖5</b></p><p&

2、gt;  五、函數(shù)相關(guān)說明9</p><p>  1.所有函數(shù)一覽9</p><p>  2.void emit(char *res,char *num1,char *op,char *num2)9</p><p>  3.char *newTemp()10</p><p>  4.int merge(int p1,int

3、p2)10</p><p>  5.void backpatch(int p,int t)11</p><p>  6.void fuzhi()11</p><p>  7.void tiaojian(int *nChain)12</p><p>  8.void xunhuan()13</p><p&g

4、t;  六、程序運(yùn)行結(jié)果15</p><p>  七、編譯器使用說明17</p><p>  八、心得與體會17</p><p>  九、源程序清單18</p><p><b>  課設(shè)要求</b></p><p>  用C語言對下述文法和單詞表定義的語言設(shè)計(jì)編制一個編譯器。<

5、;/p><p>  (1)單詞符號及種別表</p><p><b> ?。?)語法結(jié)構(gòu)定義</b></p><p>  <程序> ::= main()<語句塊> </p><p>  <語句塊> ::= ‘{‘<語句串>’}’ //程序用括號括起來</p>&l

6、t;p>  <語句串>::=<語句>{;<語句>};</p><p>  <語句>::=<賦值語句>|<條件語句>|<循環(huán)語句></p><p>  <賦值語句>::=ID=<表達(dá)式> //賦值語句用”=”號</p><p>  <條件語句>

7、;::=if<條件><語句塊> //條件怎么沒有括號,囧(自己加1個)</p><p>  <循環(huán)語句>::=do <語句塊>while <條件></p><p>  <條件>::=<表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式> //沒有布爾運(yùn)算,還算簡單</p><p

8、>  <表達(dá)式> ::= <項(xiàng)>{ +<項(xiàng)>|-<項(xiàng)>}</p><p>  <項(xiàng)> ::= <因子>{*<因子>|/<因子>}</p><p>  <因子> ::=ID|num|(<表達(dá)式>)</p><p>  num::= ( +|-|

9、ε ) 數(shù)字*(.數(shù)字?jǐn)?shù)字* | ε)( e ( +|-|ε ) 數(shù)字?jǐn)?shù)字*|ε)</p><p>  ID::=字母(字母|d數(shù)字)*</p><p>  字母::=a|b|c…|z|A|B|C…|Z</p><p>  數(shù)字::=0|1|2…|9</p><p>  <關(guān)系運(yùn)算符> ::= <|<=|>|&g

10、t;=|==|!=</p><p><b>  總體設(shè)計(jì)思想</b></p><p>  采用遞歸下降(自上而下)的語法制導(dǎo)翻譯法。</p><p><b>  詳細(xì)算法設(shè)計(jì)</b></p><p>  在前兩次試驗(yàn)的基礎(chǔ)上改進(jìn)。詞法分析程序 語法分析程序 語義分析程序 編譯器。不斷完善,不斷改

11、進(jìn)。漸變的過程。</p><p><b>  流程框圖</b></p><p>  圖 I 主函數(shù)示意圖</p><p><b>  函數(shù)相關(guān)說明</b></p><p><b>  所有函數(shù)一覽</b></p><p>  void scanner()

12、; //掃描</p><p>  void lrparser(); </p><p>  void staBlock(int *nChain); //語句塊</p><p>  void staString(int *nChain); //語句串</p><p>  void sta(int *nChain); //語句</p>

13、<p>  void fuzhi(); //賦值語句</p><p>  void tiaojian(int *nChain); //條件語句</p><p>  void xunhuan(); //循環(huán)語句</p><p>  char* E(); //Expresiion表達(dá)式</p><p>  char* T(); //T

14、erm項(xiàng)</p><p>  char* F(); //Factor因子</p><p>  char *newTemp(); //自動生成臨時變量</p><p>  void backpatch(int p,int t); //回填</p><p>  int merge(int p1,int p2); //合并p1和p2</p&g

15、t;<p>  void emit(char *res,char *num1,char *op,char *num2); //生成四元式</p><p>  void emit(char *res,char *num1,char *op,char *num2)</p><p>  該函數(shù)的功能是生成一個三地址語句送到四元式表中。</p><p>  v

16、oid emit(char *res,char *num1,char *op,char *num2)</p><p><b>  {</b></p><p>  strcpy(fourCom[q].result,res);</p><p>  strcpy(fourCom[q].arg1,num1);</p><p> 

17、 strcpy(fourCom[q].opera,op);</p><p>  strcpy(fourCom[q].arg2,num2);</p><p><b>  q++;</b></p><p><b>  }</b></p><p>  四元式表中的結(jié)構(gòu)如下:</p><

18、p><b>  struct{</b></p><p>  char result[10]; //字符串(字符數(shù)組)</p><p>  char arg1[10]; //操作數(shù)1</p><p>  char opera[10]; //運(yùn)算符</p><p>  char arg2[10]; //操作數(shù)2<

19、/p><p>  }fourCom[20]; //結(jié)構(gòu)體數(shù)組</p><p>  char *newTemp()</p><p>  該函數(shù)的功能是會動一個新的臨時變量,臨時變量名產(chǎn)生的順序是T1,T2,T3,….</p><p>  char *newTemp()</p><p><b>  {</b&

20、gt;</p><p><b>  char *p;</b></p><p>  char varTemp[10];</p><p>  p=(char *)malloc(10);</p><p><b>  kk++;</b></p><p>  itoa(kk,varTe

21、mp,10); //整數(shù)轉(zhuǎn)換為字符串</p><p>  strcpy(p+1,varTemp);</p><p>  p[0]='T'; //字符串前加T,便于識別</p><p><b>  return p;</b></p><p><b>  }</b></p>

22、<p>  int merge(int p1,int p2)</p><p>  該函數(shù)的功能是將以P1,P2為鏈?zhǔn)椎膬蓷l鏈合并成一條鏈,返回時的函數(shù)值作為合并后的鏈?zhǔn)住?lt;/p><p>  int merge(int p1,int p2) //合并p1和p2</p><p><b>  {</b></p><p

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

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

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

26、</b></p><p>  return nResult; //p2是頭,p1覆蓋0,接在p2后邊</p><p><b>  }</b></p><p>  void backpatch(int p,int t)</p><p>  該函數(shù)的功能是把P所鏈接的每個四元式的第四區(qū)段(result段)都回填t

27、。</p><p>  void backpatch(int p,int t) </p><p><b>  {</b></p><p>  int w,circle=p;</p><p>  while(circle) //circle不為0的時候</p><p><b>  {<

28、;/b></p><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

29、",t);</p><p>  circle=w; //w記錄的是鏈條上下一個四元式,移動!</p><p><b>  }</b></p><p><b>  return;</b></p><p><b>  }</b></p><p> 

30、 void fuzhi()</p><p>  該函數(shù)的功能是對賦值語句進(jìn)行分析。</p><p>  void fuzhi() //賦值語句只有1個操作數(shù)</p><p><b>  {</b></p><p>  char res[10],num[10]; //num操作數(shù)</p><p> 

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

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

33、/b></p><p><b>  {</b></p><p>  printf("缺少=號\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }&l

34、t;/b></p><p>  void tiaojian(int *nChain)</p><p>  該函數(shù)的功能是對條件語句進(jìn)行分析。</p><p>  //<條件語句>->if(<條件>)<語句塊></p><p>  void tiaojian(int *nChain)</p&

35、gt;<p><b>  {</b></p><p>  char res[10],num1[10],num2[10],op[10];</p><p>  int nChainTemp;</p><p>  //<條件>-><表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式></p>

36、<p>  if(syn==6) //if</p><p><b>  {</b></p><p>  scanner();</p><p>  //strcpy(num1,E());</p><p>  if(syn==26) //(</p><p><b>  {<

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

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

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

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

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

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

43、;b>  }</b></p><p>  scanner();</p><p>  strcpy(num2,E());</p><p>  strcat(num1,op);</p><p>  strcat(num1,num2);</p><p>  //nfc=nextq+1;</p>

44、<p>  ntc=nextq; //記住if語句位置</p><p>  emit("0","if",num1,"goto"); </p><p>  nfc=nextq; //if中表達(dá)式為假</p><p>  emit("0","","&

45、quot;,"goto");</p><p><b>  //第一個0已回填</b></p><p>  backpatch(ntc,nextq); //ntc鏈接的所有四元式都回填nextq</p><p><b>  }</b></p><p>  if(syn==27)

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

47、}</b></p><p>  void xunhuan()</p><p>  該函數(shù)的功能是對循環(huán)語句進(jìn)行分析。</p><p>  //<循環(huán)語句>::=do <語句塊>while <條件></p><p>  void xunhuan()</p><p><

48、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><p> 

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

50、<p>  if(syn==9) //while</p><p><b>  {</b></p><p>  scanner();</p><p>  if(syn==26) //(</p><p><b>  {</b></p><p>  scanner();&

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

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

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

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

55、<p>  strcpy(op,"==");</p><p><b>  break;</b></p><p><b>  case 37:</b></p><p>  strcpy(op,"!=");</p><p><b>  bre

56、ak;</b></p><p><b>  default:</b></p><p>  printf("error");</p><p><b>  }</b></p><p><b>  }</b></p><p> 

57、 scanner();</p><p>  strcpy(num2,E());</p><p>  strcat(num1,op);</p><p>  strcat(num1,num2);</p><p>  nnb=nextq;</p><p>  emit("0","if"

58、,num1,"goto"); </p><p>  backpatch(nnb,nnc);</p><p>  nna=nextq;</p><p>  emit("0","","","goto");</p><p>  backpatch(n

59、na,nextq);</p><p><b>  }</b></p><p>  if(syn==27) //)</p><p>  scanner();</p><p><b>  }</b></p><p><b>  }</b></p>

60、;<p><b>  }</b></p><p><b>  程序運(yùn)行結(jié)果</b></p><p>  圖 VI 賦值語句的分析</p><p>  圖 VII 條件語句的分析</p><p>  圖 VIII 循環(huán)語句的分析</p><p><b>

61、  圖 IX 綜合</b></p><p><b>  編譯器使用說明</b></p><p>  程序提示用戶輸入字符串“Please input your source string:”,用戶輸入字符串并以“#”號結(jié)束。回車后,程序顯示運(yùn)行結(jié)果。</p><p><b>  心得與體會</b></p&

62、gt;<p>  剛拿到課設(shè)題目的時候,感覺很難,沒有頭緒。雖然之前實(shí)驗(yàn)時候,詞法分析程序和語法分析程序的代碼都是自己一個一個敲的。但是記得那時的語法分析程序用的是遞歸下降分析法,而且只判斷輸入串是否是文法的句子(輸出只有簡單的success或者error)。課設(shè)的要求呢?要加上語義分析,而且要輸出四元式。好像語義分析的部分,我一點(diǎn)印象也沒有了,老師那一部分上得有點(diǎn)快。運(yùn)動會3天假,時間全用來啃課本了?!罢Z義分析與中間代碼

63、生成”,我又一點(diǎn)一點(diǎn)的看。3天時間,終于可以寫出語義程序了。</p><p>  這是課設(shè)的第1個里程碑。采用遞歸下降的語法制導(dǎo)翻譯法,實(shí)現(xiàn)了對賦值表達(dá)式的語義分析,并生成四元式。</p><p>  但是后來發(fā)現(xiàn),更難的東西在后邊。程序語句有3種:賦值語句,條件語句,循環(huán)語句。而賦值語句的翻譯,恰恰是最簡單的。對于賦值語句的翻譯,課本上有詳細(xì)的講解,有代碼的簡單舉例。而對于條件語句(if

64、…else…)和循環(huán)語句(do…while…),課本講解不那么詳細(xì),沒有代碼舉例,上課時候我也沒太理解老師所講解的。特別是其中鏈nChain的概念,一直看不懂。因?yàn)檫@個困難,課設(shè)被我擱置了3天。</p><p>  再后來利用上機(jī)的時間,請教了一下老師和另外一個同學(xué),發(fā)現(xiàn)課本后給的樣例程序是錯的,而且錯得一塌糊涂。只好自己寫,寫,寫。</p><p>  然后就是課設(shè)的第2個里程碑。實(shí)現(xiàn)了

65、對條件語句(if語句)的分析,并生成四元式。</p><p>  接下來又是開發(fā)停滯的一段時間,直到11月18日。熟悉了一下原先寫的代碼,然后開始繼續(xù)后邊的部分。</p><p>  迎來了課設(shè)的第3個里程碑。實(shí)現(xiàn)了對循環(huán)語句(while語句)的分析,并生成四元式。而且好像沒有預(yù)期中困難,可能是有條件語句的鋪墊吧。他們的處理方法其實(shí)很類似,也是emit+backpatch+merge。而且

66、由于老師給的語法中沒有布爾表達(dá)式,所以很多merge的工作也可以省略了,嘿嘿。</p><p>  最后一步就是整合,系統(tǒng)測試,書寫文檔了。</p><p>  個人認(rèn)為這次課設(shè)的機(jī)會非常寶貴,加深了我對編譯器處理語言的過程的理解。我想,作為學(xué)軟件的學(xué)生,不應(yīng)該只會用Java,或者C++,或者C#。一門高級語言其實(shí)學(xué)起來是很容易的,而在校期間,這些計(jì)算機(jī)基礎(chǔ)課程一定要學(xué)好!才能為將來打好基

67、礎(chǔ)。</p><p><b>  源程序清單</b></p><p>  //************編譯器********************</p><p><b>  //</b></p><p>  //***Erin***</p><p>  //***軟件工程

68、0801班***</p><p>  //***HUST***</p><p><b>  //</b></p><p>  //**************************************</p><p>  #include<stdio.h></p><p>  #

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

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

71、2正號)</p><p>  int isError;</p><p>  int isDecimal; //是否是小數(shù) </p><p>  double decimal; //小數(shù) </p><p>  int isExp; //是否是指數(shù) </p><p>  int index; //指數(shù)冪

72、 </p><p>  int isNegative; //是否帶負(fù)號 </p><p>  double temp; </p><p>  int temp2;</p><p>  int repeat; //是否連續(xù)出現(xiàn)+,-</p><p>  int nextq;</p><p>

73、;  int kk; //臨時變量的標(biāo)號</p><p>  int ntc,nfc,nnc,nnb,nna;</p><p>  char *rwtab[9]={"main","int","float","double","char","if","else&q

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

75、><p>  char arg2[10];</p><p>  }fourCom[20]; //結(jié)構(gòu)體數(shù)組</p><p>  void scanner(); //掃描</p><p>  void lrparser(); </p><p>  void staBlock(int *nChain); //語句塊</p

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

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

78、<p>  void 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>  void main(

79、)</p><p><b>  {</b></p><p><b>  p=0;</b></p><p><b>  count=0;</b></p><p>  isDecimal=0;</p><p><b>  index=0;</

80、b></p><p><b>  repeat=0;</b></p><p><b>  kk=0;</b></p><p>  printf("\nPlease input your source string:\n");</p><p><b>  do{&l

81、t;/b></p><p>  ch=getchar();</p><p>  prog[p++]=ch;</p><p>  }while(ch!='#');</p><p><b>  p=0;</b></p><p>  isError=0;</p>&l

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

83、p>  printf("(%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><

84、;p>  void lrparser()</p><p><b>  {</b></p><p>  int nChain;</p><p>  nfc=ntc=1;</p><p><b>  nextq=1;</b></p><p>  if(syn==1) //m

85、ain</p><p><b>  {</b></p><p>  scanner();</p><p>  if(syn==26) //(</p><p><b>  {</b></p><p>  scanner();</p><p>  if(s

86、yn==27) //)</p><p><b>  {</b></p><p>  scanner();</p><p>  staBlock(&nChain);</p><p><b>  }</b></p><p><b>  else</b>

87、;</p><p>  printf("缺少右括號\n");</p><p><b>  }</b></p><p><b>  else </b></p><p>  printf("缺少左括號\n");</p><p><b&

88、gt;  }</b></p><p><b>  else</b></p><p>  printf("缺少main\n");</p><p><b>  }</b></p><p>  //<語句塊> ::= '{'<語句串>

89、'}'</p><p>  void staBlock(int *nChain) //語句塊</p><p><b>  {</b></p><p>  if(syn==28) //{</p><p><b>  {</b></p><p>  scanner

90、();</p><p>  staString(nChain);</p><p>  //backpatch(*nChain,nextq);</p><p>  if(syn==29) //}</p><p>  scanner(); //讀下一個</p><p><b>  else</b>&

91、lt;/p><p>  printf("缺少}號\n");</p><p><b>  }</b></p><p><b>  else</b></p><p>  printf("缺少{號\n");</p><p><b>  

92、}</b></p><p>  //<語句串>::=<語句>{;<語句>};</p><p>  void staString(int *nChain) //語句串</p><p><b>  {</b></p><p>  sta(nChain);</p>

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

94、}</b></p><p>  //backpatch(*nChain,nextq-1);</p><p><b>  }</b></p><p>  void sta(int *nChain) //語句</p><p><b>  {</b></p><p> 

95、 if(syn==10)</p><p><b>  {</b></p><p><b>  fuzhi();</b></p><p>  //*nChain=0;</p><p><b>  }</b></p><p>  else if(syn==6

96、) //if</p><p><b>  {</b></p><p>  tiaojian(nChain);</p><p><b>  }</b></p><p>  else if(syn==8) //do</p><p>  xunhuan();</p>

97、<p><b>  }</b></p><p>  //<條件語句>->if(<條件>)<語句塊></p><p>  void tiaojian(int *nChain)</p><p><b>  {</b></p><p>  char re

98、s[10],num1[10],num2[10],op[10];</p><p>  int nChainTemp;</p><p>  //<條件>-><表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式></p><p>  if(syn==6) //if</p><p><b>  {</

99、b></p><p>  scanner();</p><p>  //strcpy(num1,E());</p><p>  if(syn==26) //(</p><p><b>  {</b></p><p>  scanner();</p><p>  str

100、cpy(num1,E());</p><p>  if((syn<=37)&&(syn>=32)) </p><p><b>  {</b></p><p>  switch(syn)</p><p><b>  {</b></p><p><

101、;b>  case 32:</b></p><p>  strcpy(op,">");</p><p><b>  break;</b></p><p><b>  case 33:</b></p><p>  strcpy(op,">=&

102、quot;);</p><p><b>  break;</b></p><p><b>  case 34:</b></p><p>  strcpy(op,"<");</p><p><b>  break;</b></p><

103、p><b>  case 35:</b></p><p>  strcpy(op,"<=");</p><p><b>  break;</b></p><p><b>  case 36:</b></p><p>  strcpy(op,&qu

104、ot;==");</p><p><b>  break;</b></p><p><b>  case 37:</b></p><p>  strcpy(op,"!=");</p><p><b>  break;</b></p>

105、<p><b>  default:</b></p><p>  printf("error");</p><p><b>  }</b></p><p><b>  }</b></p><p>  scanner();</p>&l

106、t;p>  strcpy(num2,E());</p><p>  strcat(num1,op);</p><p>  strcat(num1,num2);</p><p>  //nfc=nextq+1;</p><p>  ntc=nextq; //記住if語句位置</p><p>  emit("

107、;0","if",num1,"goto"); </p><p>  nfc=nextq; //if中表達(dá)式為假</p><p>  emit("0","","","goto");</p><p><b>  //第一個0已回填&

108、lt;/b></p><p>  backpatch(ntc,nextq); //ntc鏈接的所有四元式都回填nextq</p><p><b>  }</b></p><p>  if(syn==27) //)</p><p>  scanner();</p><p>  staBlo

109、ck(&nChainTemp); //語句塊</p><p>  *nChain=merge(nChainTemp,nfc);</p><p><b>  }</b></p><p><b>  }</b></p><p>  //<循環(huán)語句>::=do <語句塊>w

110、hile <條件></p><p>  void xunhuan()</p><p><b>  {</b></p><p>  char res[10],num1[10],num2[10],op[10];</p><p>  int nChainTemp;</p><p>  if(

111、syn==8) //do</p><p><b>  {</b></p><p>  nnc=nextq; //記住if語句位置,emit之后nextq就變了</p><p>  //emit("0","if",num1,"goto"); </p><p>  

112、scanner();</p><p>  staBlock(&nChainTemp); //語句塊</p><p>  if(syn==9) //while</p><p><b>  {</b></p><p>  scanner();</p><p>  if(syn==26) //(

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

114、;</p><p>  switch(syn)</p><p><b>  {</b></p><p><b>  case 32:</b></p><p>  strcpy(op,">");</p><p><b>  break;<

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

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

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

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

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

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

121、quot;","","goto");</p><p>  backpatch(nna,nextq);</p><p><b>  }</b></p><p>  if(syn==27) //)</p><p>  scanner();</p><p&

122、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void fuzhi() //賦值語句只有1個操作數(shù)</p><p><b>  {</b></p><p

123、>  char res[10],num[10]; //num操作數(shù)</p><p>  if(syn==10) //字符串</p><p><b>  {</b></p><p>  strcpy(res,token); //結(jié)果</p><p>  scanner();</p><p> 

124、 if(syn==21) //=</p><p><b>  {</b></p><p>  scanner();</p><p>  strcpy(num,E());</p><p>  emit(res,num,"=","");</p><p><

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

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

127、t;p>  res=(char *)malloc(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&g

128、t;<p>  while((syn==22)||(syn==23)) //+ -</p><p><b>  {</b></p><p>  if(syn==22) //+</p><p>  strcpy(op,"+");</p><p><b>  else</b&

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

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

131、;b>  {</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>&l

132、t;p>  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>&

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

134、gt;  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>

135、;  }</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) //字符串&

136、lt;/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><

137、;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) //(</p><p

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

139、();</p><p><b>  }</b></p><p>  else isError=1;</p><p><b>  }</b></p><p><b>  else</b></p><p>  isError=1;</p>&l

140、t;p>  return res;</p><p><b>  }</b></p><p>  char *newTemp()</p><p><b>  {</b></p><p><b>  char *p;</b></p><p>  cha

141、r 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><p><b>

142、;  p[0]='T';</b></p><p><b>  return p;</b></p><p><b>  }</b></p><p>  //將p所鏈接的每個四元式的第四個分量都回填t</p><p>  void backpatch(int p,int t)

143、 </p><p><b>  {</b></p><p>  int w,circle=p;</p><p>  while(circle) //circle不為0的時候</p><p><b>  {</b></p><p>  w=atoi(fourCom[circle

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

145、條上下一個四元式,移動!</p><p><b>  }</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  int merge(int p1,int p2) //合并p1和p2</p><

146、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><p&g

147、t;<b>  {</b></p><p>  nResult=circle=p2;</p><p>  while(atoi(fourCom[circle].result)) //四元式第四個分量不為0</p><p><b>  {</b></p><p>  circle=atoi(fourC

148、om[circle].result); </p><p>  //strcpy(fourCom[circle].result,p1);</p><p>  sprintf(fourCom[circle].result,"%s",p1);</p><p><b>  }</b></p><p>  //

149、目的是用p1的值覆蓋0</p><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,ch

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

溫馨提示

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

最新文檔

評論

0/150

提交評論