編譯技術(shù)課程設(shè)計(jì)報(bào)告-詞法分析、語法分析、中間代碼生成_第1頁
已閱讀1頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  編譯技術(shù)課程設(shè)計(jì)</b></p><p>  班 級 </p><p>  學(xué) 號 </p><p>  姓 名 </p><p>  指導(dǎo)老師 </p><

2、;p><b>  年 月</b></p><p><b>  目 錄</b></p><p>  一、目的------------------------------------------------------------------------------------------2</p><p>  二

3、、任務(wù)及要求---------------------------------------------------------------------------------2</p><p>  三、實(shí)驗(yàn)環(huán)境------------------------------------------------------------------------------------4</p><p

4、>  四、實(shí)現(xiàn)過程說明------------------------------------------------------------------------------4</p><p>  1.詞法分析器------------------------------------------------------------------------------4</p><

5、p> ?。?)單詞符號表------------------------------------------------------------------------4</p><p>  (2)數(shù)據(jù)結(jié)構(gòu)---------------------------------------------------------------------------5</p><p> ?。?/p>

6、3)函數(shù)說明---------------------------------------------------------------------------5</p><p> ?。?)流程圖------------------------------------------------------------------------------6</p><p>  2.語法分

7、析器------------------------------------------------------------------------------6</p><p> ?。?)分析方法說明---------------------------------------------------------------------6</p><p> ?。?)文法--------

8、-------------------------------------------------------------------------6</p><p>  (3)數(shù)據(jù)結(jié)構(gòu)---------------------------------------------------------------------------7</p><p> ?。?)函數(shù)說明--------

9、-------------------------------------------------------------------7</p><p>  3.中間代碼生成器------------------------------------------------------------------------10</p><p> ?。?)屬性文法--------------

10、------------------------------------------------------------10</p><p> ?。?)數(shù)據(jù)結(jié)構(gòu)--------------------------------------------------------------------------11</p><p>  (3)函數(shù)說明--------------------

11、------------------------------------------------------11</p><p>  (4)流程圖------------------------------------------------------------------------------11</p><p>  五、程序運(yùn)行結(jié)果----------------------

12、--------------------------------------------------------12</p><p>  六、總結(jié)------------------------------------------------------------------------------------------16</p><p><b>  一、目的</

13、b></p><p>  <<編譯技術(shù)>>是理論與實(shí)踐并重的課程,而其課程設(shè)計(jì)要綜合運(yùn)用一、二年級所學(xué)的多門課程的內(nèi)容,用來完成一個(gè)小型編譯程序。從而鞏固和加強(qiáng)對詞法分析、語法分析、語義分析、代碼生成和報(bào)錯(cuò)處理等理論的認(rèn)識(shí)和理解;培養(yǎng)學(xué)生對完整系統(tǒng)的獨(dú)立分析和設(shè)計(jì)的能力,進(jìn)一步培養(yǎng)學(xué)生的獨(dú)立編程能力。</p><p><b>  二、任務(wù)及要求<

14、;/b></p><p><b>  基本要求:</b></p><p>  詞法分析器 產(chǎn)生下述小語言的單詞序列</p><p>  這個(gè)小語言的所有的單詞符號,以及它們的種別編碼和內(nèi)碼值如下表:</p><p>  對于這個(gè)小語言,有幾點(diǎn)重要的限制:</p><p>  首先,所有的關(guān)

15、鍵字(如if﹑while等)都是“保留字”。所謂的保留字的意思是,用戶不得使用它們作為自己定義的標(biāo)示符。例如,下面的寫法是絕對禁止的:</p><p>  if(5)=x </p><p>  其次,由于把關(guān)鍵字作為保留字,故可以把關(guān)鍵字作為一類特殊標(biāo)示符來處理。也就是說,對于關(guān)鍵字不專設(shè)對應(yīng)的轉(zhuǎn)換圖。但把它們(及其種別編碼)預(yù)先安排在一張表格中(

16、此表叫作保留字表)。當(dāng)轉(zhuǎn)換圖識(shí)別出一個(gè)標(biāo)識(shí)符時(shí),就去查對這張表,確定它是否為一個(gè)關(guān)鍵字。</p><p>  再次,如果關(guān)鍵字、標(biāo)識(shí)符和常數(shù)之間沒有確定的運(yùn)算符或界符作間隔,則必須至少用一個(gè)空白符作間隔(此時(shí),空白符不再是完全沒有意義的了)。例如,一個(gè)條件語句應(yīng)寫為</p><p>  if i>0 i= 1;</p><p><b>  而絕對

17、不要寫成</b></p><p>  ifi>0 i=1;</p><p>  因?yàn)閷τ诤笳?,我們的分析器將無條件地將ifi看成一個(gè)標(biāo)識(shí)符。</p><p>  這個(gè)小語言的單詞符號的狀態(tài)轉(zhuǎn)換圖,如下圖:</p><p>  語法分析器 能識(shí)別由加+ 乘* 乘方** 括號()操作數(shù)所組成的算術(shù)表達(dá)式,其文法如下:</

18、p><p><b>  E→E+T|T</b></p><p><b>  T→T*F|F</b></p><p><b>  F→P**F|P</b></p><p><b>  P→(E)|i</b></p><p>  使用的算法

19、可以是:預(yù)測分析法;遞歸下降分析法;LR分析法等。</p><p>  中間代碼生成器 產(chǎn)生上述算術(shù)表達(dá)式的中間代碼(四元式序列)</p><p><b>  較高要求:</b></p><p>  擴(kuò)充上述小語言的單詞;</p><p>  增加語法分析器的功能,能識(shí)別條件語句和循環(huán)語句等;</p>&

20、lt;p>  增加中間代碼生成器的功能,能產(chǎn)生條件語句和循環(huán)語句等的中間代碼(四元式序列)</p><p>  報(bào)錯(cuò)基礎(chǔ)上增加錯(cuò)誤信息;</p><p>  將中間代碼翻譯成匯編語言。</p><p><b>  三、實(shí)驗(yàn)環(huán)境</b></p><p>  開發(fā)環(huán)境VC++;Visual Studio;Java開發(fā)環(huán)

21、境</p><p>  語言C;C++;C#;Java</p><p>  說明:課程設(shè)計(jì)可以使用任何一種語言工具,課程設(shè)計(jì)報(bào)告中請按照自己實(shí)際采用的開發(fā)工具及技術(shù)來寫。</p><p><b>  四、實(shí)現(xiàn)過程說明</b></p><p><b>  1.詞法分析器</b></p>

22、<p><b> ?。?)單詞符號表</b></p><p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p>  用words[10]存放構(gòu)成單詞符號的字符串,并且用于判斷是否為關(guān)鍵字。flags[500] 存放單詞符號的種別碼。Number存放整數(shù)值,words[]存放標(biāo)識(shí)符,關(guān)鍵字或者其他符號。cnt[num]按順序存放讀到的字符,為

23、下面語義分析做準(zhǔn)備。Status用于判斷是否為關(guān)鍵字,1是,0不是。</p><p><b>  函數(shù)說明</b></p><p>  在Scan ()子函數(shù)中,先全部初始化,然后讀一個(gè)字符,分析它是什么類型:如果是字母類型,則接著往下讀,直到讀到非字母的字符,存入words[10]中,依次對比關(guān)鍵字表中的元素,如果相同,則將flags[]置為相應(yīng)的種別碼,如果全都掃

24、描后沒發(fā)現(xiàn)相同的關(guān)鍵字,則為普通的標(biāo)識(shí)符,返回主函數(shù)輸出。</p><p>  如果是數(shù)字類型,首先分析第一個(gè)符號,接著讀下一個(gè)字符串,直到讀到一個(gè)不是數(shù)字的字符串位置,每讀一個(gè)數(shù)字字符,就將他們轉(zhuǎn)化為相應(yīng)的數(shù)字,使用輾轉(zhuǎn)相乘法,每次都讓number先自乘10,然后加上這個(gè)數(shù)字,這樣就將字符串表示的數(shù)字轉(zhuǎn)化成了相應(yīng)的數(shù),返回主函數(shù)輸出。</p><p>  如果是其他單詞表的符號,則將他們

25、的flags[]置為相應(yīng)的種別碼,并將字符存到words[] 中返回主函數(shù)輸出。</p><p><b>  流程圖</b></p><p><b>  2.語法分析器</b></p><p> ?。?)分析方法說明 </p><p><b>  采用遞歸下降分析法</b>&

26、lt;/p><p><b>  文法</b></p><p>  E→E+T|E-T|T</p><p>  T→T*F|E/F|F</p><p><b>  F→P**F|P</b></p><p><b>  P→(E)|i</b></p>

27、<p><b>  改造后的文法</b></p><p>  E→TE’|TE’’</p><p><b>  E’→+TE’|ε</b></p><p>  E’’→-TE’’|ε</p><p>  T→FT’|FT’’</p><p><b> 

28、 T’→*FT’|ε</b></p><p>  T’’→/FT’’|ε</p><p><b>  F→PF’</b></p><p><b>  F’→**F|ε</b></p><p><b>  P→(E)|i</b></p><p>

29、;  (3)數(shù)據(jù)結(jié)構(gòu)與函數(shù)說明</p><p>  在main函數(shù)調(diào)用E()函數(shù),如果調(diào)用之后返回時(shí),如果((flags[temp]==0)&&is_right)為真,就輸出“分析成功”,否則輸出“分析失敗”。其中is_right為設(shè)定的標(biāo)志,初值為1,如果在調(diào)用子函數(shù)的過程中如果有錯(cuò)誤,則置is_right為0。</p><p>  E函數(shù): 調(diào)用T函數(shù),調(diào)用F函數(shù),

30、 調(diào)用P函數(shù),返回后看是否是’+’或’-’,如果是,則調(diào)用 E1函數(shù),再調(diào)用E2函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p>  E1函數(shù):判斷是不是”+”或者“-” 如果是,調(diào)用F函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p><b>  代碼:</b></p><p><b>

31、  void E()</b></p><p><b>  {</b></p><p>  cout<<"E->TE''"<<endl;</p><p><b>  T();</b></p><p><b>  E

32、2();</b></p><p><b>  }</b></p><p><b>  void E1()</b></p><p><b>  {</b></p><p>  if(flags[temp]==9) //加號</p><p>

33、;<b>  {</b></p><p>  cout<<"E'->+T"<<endl;</p><p><b>  temp++;</b></p><p><b>  T();</b></p><p><b>

34、;  }</b></p><p>  else if(flags[temp]==12)//減號</p><p><b>  {</b></p><p>  cout<<"E'->-T"<<endl;</p><p><b>  temp++;

35、</b></p><p><b>  T();</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  is_right=0;</p><p><b>  }</b&g

36、t;</p><p><b>  void E2()</b></p><p><b>  {</b></p><p>  if(flags[temp]==9||flags[temp]==12)//如果是加或減</p><p><b>  {</b></p><

37、;p>  cout<<"E''->E'E''"<<endl;</p><p><b>  E1();</b></p><p><b>  E2();</b></p><p><b>  }</b></

38、p><p>  else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非</p><p><b>  {</b></p><p>  cout<<"E''->ε"<<endl;</p><p><b>  

39、return ;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  is_right=0;</p><p>  T函數(shù): 調(diào)用F函數(shù), 調(diào)用P函數(shù),返回后看是否是’*’或’/’,如果是,則調(diào)用T1函數(shù),再調(diào)用T2函數(shù),如果

40、不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p>  T1函數(shù):判斷是不是”*”或者“/” 如果是,調(diào)用F函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p><b>  代碼:</b></p><p><b>  void T()</b></p><p><

41、b>  {</b></p><p>  cout<<"T->FT''"<<endl;</p><p><b>  F();</b></p><p><b>  T2();</b></p><p><b> 

42、 }</b></p><p><b>  void T1()</b></p><p><b>  {</b></p><p>  if(flags[temp]==10) //乘號</p><p><b>  {</b></p><p&

43、gt;  cout<<"T'->*F"<<endl;</p><p><b>  temp++;</b></p><p><b>  F();</b></p><p><b>  }</b></p><p>  else

44、 if(flags[temp]==13) //除號</p><p><b>  {</b></p><p>  cout<<"T'->/F"<<endl;</p><p><b>  temp++;</b></p><p><b>

45、;  F();</b></p><p><b>  }</b></p><p>  else is_right=0;</p><p><b>  }</b></p><p><b>  void T2()</b></p><p><b&

46、gt;  {</b></p><p>  if(flags[temp]==10||flags[temp]==13)//如果是乘或除</p><p><b>  {</b></p><p>  cout<<"T''->T'T''"<<endl;&

47、lt;/p><p><b>  T1();</b></p><p><b>  T2();</b></p><p><b>  }</b></p><p>  else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非)</p>

48、<p><b>  {</b></p><p>  cout<<"T''->ε"<<endl;</p><p><b>  return ;</b></p><p><b>  }</b></p><p

49、>  else is_right=0;</p><p><b>  }</b></p><p>  F函數(shù):調(diào)用P函數(shù),F(xiàn)1函數(shù)。</p><p>  F1函數(shù):判斷是不是”**”,如果是,調(diào)用F函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p><b>  代碼:</b>

50、;</p><p><b>  void F()</b></p><p><b>  {</b></p><p>  cout<<"F->PF'"<<endl;</p><p><b>  P();</b></p&

51、gt;<p><b>  F1();</b></p><p><b>  }</b></p><p><b>  void F1()</b></p><p><b>  {</b></p><p>  if(flags[temp]==11)

52、 //乘?方?</p><p><b>  {</b></p><p>  cout<<"F'->**F"<<endl;</p><p><b>  temp++;</b></p><p><b>  F();</b

53、></p><p><b>  }</b></p><p>  Elseif(flags[temp]!=0&&flags[temp]!=17&&flags[temp]!=9&&flags[temp]!=12&&flags[temp]!=10&&flags[temp]!=13)/

54、/非#非)非+非-非*非/</p><p><b>  {</b></p><p>  cout<<"F'->ε?"<<endl;</p><p>  is_right=0;</p><p><b>  }</b></p>&l

55、t;p><b>  }</b></p><p>  P函數(shù): 檢查是否標(biāo)識(shí)符,如果是,調(diào)用P1函數(shù),如果不是,檢查是否是數(shù)值,如果是,調(diào)用P1函數(shù),如果不是,檢查是否是’(’,如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。如果是,調(diào)用E函數(shù),返回后檢查是否是’)’,如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。如果是,調(diào)用F1函數(shù),返回。</p><p>&

56、lt;b>  代碼:</b></p><p><b>  void P()</b></p><p><b>  {</b></p><p>  if(flags[temp]==6||flags[temp]==7) //標(biāo)識(shí)符或常數(shù)</p><p><b>  {<

57、/b></p><p>  cout<<"P->i"<<endl;</p><p><b>  temp++;</b></p><p><b>  }</b></p><p>  else if(flags[temp]==17) //(&l

58、t;/p><p><b>  {</b></p><p>  cout<<"P->(E)"<<endl;</p><p><b>  temp++;</b></p><p><b>  E();</b></p><

59、;p>  if(flags[temp]==17) //)</p><p><b>  {</b></p><p>  cout<<"P->(E)"<<endl;</p><p><b>  temp++;</b></p><p><b

60、>  }</b></p><p><b>  else</b></p><p>  is_right=0;</p><p><b>  }</b></p><p>  else is_right =0;</p><p><b>  }</b&

61、gt;</p><p><b>  3.中間代碼生成器</b></p><p><b> ?。?)屬性文法 </b></p><p>  E→E’+T E.val=E’.val+T.val</p><p>  E→E’’-T E.val=E’’.val-T.val</p&g

62、t;<p>  E→T E.val=T.val</p><p>  T→T’*F T.val=T’.val*F.val</p><p>  T→T’’/F T.val=T’’.val/F.val</p><p>  T→F T.val=F.val</p><p>  F

63、’→P**F F’.val=P.val**F.val</p><p>  F’→P F’.val=P.val</p><p>  P→(E) P.val=E.val</p><p>  F→i F.val=i,lexval</p><p>  (2)數(shù)據(jù)結(jié)構(gòu)與函數(shù)說明</p&

64、gt;<p>  Strn用來存放臨時(shí)變量的序號。</p><p>  temp用來存放數(shù)組的下表,在主程序中語法分析結(jié)束后,置0.</p><p>  定義函數(shù)newtemp()用于門生一個(gè)新的臨時(shí)變量的名字,具體實(shí)現(xiàn)時(shí)每產(chǎn)生一個(gè)T,就及時(shí)送到符號表中,也可以不進(jìn)符號表,直接將單詞值用整數(shù)碼表示。</p><p>  定義函數(shù)siyuan(),輸

65、出一個(gè)四元式。</p><p>  定義函數(shù)YE() 進(jìn)行中間代碼生成</p><p><b> ?。?)流程圖</b></p><p><b>  程序運(yùn)行結(jié)果</b></p><p>  注:本程序?qū)τ谛稳鏰1的標(biāo)識(shí)符無法作為整體識(shí)別</p><p><b> 

66、 詞法測試:</b></p><p>  表達(dá)式正確:2*3+4/(as-5)**6#</p><p><b>  詞法分析:</b></p><p><b>  語法分析</b></p><p><b>  四元式:</b></p><p>

67、;  表達(dá)式錯(cuò)誤:2*(3-2#</p><p><b>  六、總結(jié)</b></p><p>  這次課程設(shè)計(jì)使我對編譯原理有了進(jìn)一步的了解,更加鞏固了所學(xué)習(xí)的知識(shí)。編譯原理是一門比較抽象的課程,也比較難以學(xué)得透,有很多東西很模糊的。編譯這個(gè)概念有一定的了解。由于課堂上,學(xué)習(xí)的東西比較淺,難免眼高手低,故而,通過實(shí)驗(yàn)和課程,遇到了很多課本上面見不到的問題,完成實(shí)驗(yàn)后

68、,個(gè)人在成就感的同時(shí),也學(xué)習(xí)到了編程的具體過程中的很多知識(shí)。</p><p><b>  程序代碼:</b></p><p>  //#include <stdafx.h></p><p>  #include <iostream></p><p>  #include<string>

69、</p><p>  using namespace std;</p><p>  #include<stdio.h></p><p>  #include<stdlib.h> </p><p>  #include<sstream></p><p>  int i,j,k,flag

70、,number,status;</p><p>  /*status which is use to judge the string is keywords or not!*/</p><p><b>  char ch;</b></p><p>  char words[10] = {" "};</p>&

71、lt;p>  char program[500];</p><p>  int flags[500]; //存儲(chǔ)輸入句子</p><p>  string cnt[500];//標(biāo)括識(shí)符</p><p>  int temp=0; //數(shù)組下標(biāo)</p><p>  int is_right; //判斷輸出信息&l

72、t;/p><p>  //-----------------------詞法分析-----------------------------</p><p>  int Scan(char program[]) </p><p><b>  {</b></p><p>  char *keywords[5] = {"

73、while","if","else","switch","case"}; //關(guān)鍵字</p><p><b>  number=0;</b></p><p><b>  status=0;</b></p><p><b>

74、;  j=0;</b></p><p>  ch=program[i++];</p><p><b>  //遍歷</b></p><p>  if ((ch >= 'a') && (ch <= 'z' )||(ch>='A')&&(c

75、h<='Z')) //字母</p><p><b>  {</b></p><p>  while ((ch >= 'a') && (ch <= 'z' )||(ch>='A')&&(ch<='Z'))</p&

76、gt;<p><b>  {</b></p><p>  words[j++]=ch;</p><p>  ch=program[i++];</p><p><b>  }</b></p><p><b>  i--;</b></p><p&g

77、t;  words[j++] = '\0';</p><p>  for (k = 0; k < 5; k++)</p><p>  if (strcmp (words,keywords[k]) == 0) //判斷是否為關(guān)鍵字</p><p><b>  switch(k)</b></p><p&

78、gt;<b>  {</b></p><p><b>  case 0:{</b></p><p><b>  flag = 1;</b></p><p>  status = 1;</p><p><b>  break;</b></p>

79、<p><b>  }</b></p><p><b>  case 1:{</b></p><p><b>  flag = 2;</b></p><p>  status = 1;</p><p><b>  break;</b></p

80、><p><b>  }</b></p><p><b>  case 2:{</b></p><p><b>  flag = 3;</b></p><p>  status = 1;</p><p><b>  break;</b>

81、</p><p><b>  }</b></p><p><b>  case 3:{</b></p><p><b>  flag = 4;</b></p><p>  status = 1;</p><p><b>  break;<

82、/b></p><p><b>  }</b></p><p><b>  case 4:{</b></p><p><b>  flag = 5;</b></p><p>  status = 1;</p><p><b>  brea

83、k;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (status == 0)</p><p><b>  {</b></p><p>  flag = 6; //標(biāo)識(shí)

84、符</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if ((ch >= '0') && (ch <= '9')) //數(shù)字</p><p><b>  {<

85、;/b></p><p>  number = 0;</p><p>  while ((ch >= '0' ) && (ch <= '9' ))</p><p><b>  {</b></p><p>  number = number*10+(ch-&

86、#39;0');</p><p>  ch = program[i++];</p><p><b>  }</b></p><p><b>  flag = 7;</b></p><p><b>  i--;</b></p><p><b&

87、gt;  }</b></p><p>  else switch (ch) //運(yùn)算符和標(biāo)點(diǎn)符號</p><p><b>  {</b></p><p>  case '=':{</p><p>  if (ch == '=')<

88、/p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  ch = program[i++];</p><p>  if (ch == '=')</p><p><b>  {</b></p>

89、;<p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  flag = 14; </p><p><b>  }</b></p><p><b>  else</b></p><p

90、><b>  {</b></p><p><b>  i--;</b></p><p><b>  flag = 8;</b></p><p><b>  }</b></p><p><b>  break;</b></p

91、><p><b>  }</b></p><p><b>  case'>':{</b></p><p>  if (ch == '>')</p><p>  words[j++] = ch;</p><p>  words[j] =

92、'\0';</p><p>  ch = program[i++];</p><p>  if (ch == '=')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] = '

93、\0';</p><p><b>  flag =14;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>

94、;  i--;</b></p><p>  flag = 14;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case

95、'<':{</b></p><p>  if (ch == '<')</p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  ch = program[i++];</p><p&g

96、t;  if (ch == '=')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  flag = 14;</p><p><b>  

97、}</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  i--;</b></p><p>  flag = 14;</p><p><b>  }</b&g

98、t;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case'!':{</b></p><p>  if (ch == '!')</p><p>  

99、words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  ch = program[i++];</p><p>  if (ch == '=')</p><p><b>  {</b></p><p>  words

100、[j++] = ch;</p><p>  words[j] = '\0';</p><p>  flag = 14;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&

101、gt;</p><p><b>  i--;</b></p><p>  flag = 18;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b><

102、/p><p><b>  case'+':{</b></p><p>  if (ch == '+')</p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  ch = progra

103、m[i++];</p><p>  if (ch == '=')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p><b>  flag =

104、9;</b></p><p><b>  }</b></p><p>  else if (ch == '+')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] =

105、 '\0';</p><p><b>  flag = 9;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>&l

106、t;b>  i--;</b></p><p><b>  flag = 9;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p>

107、<p><b>  case'-':{</b></p><p>  if (ch == '-')</p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  ch = program[i++];&

108、lt;/p><p>  if (ch == '=')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  flag = 12;</p>&l

109、t;p><b>  }</b></p><p>  else if( ch == '-')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p>

110、<p>  flag = 12;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  i--;</b></p><p>

111、  flag = 12;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case'*':{</b></p><

112、;p>  if (ch == '*')</p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  ch = program[i++];</p><p>  if (ch == '*')</p><p&

113、gt;<b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] = '\0';</p><p>  flag = 11;</p><p><b>  }</b></p><p><b>  e

114、lse</b></p><p><b>  {</b></p><p><b>  i--;</b></p><p>  flag = 10;</p><p><b>  }</b></p><p><b>  break;<

115、/b></p><p><b>  }</b></p><p><b>  case'/':{</b></p><p>  if (ch == '/')</p><p>  words[j++] = ch;</p><p>  words

116、[j] = '\0';</p><p>  ch = program[i++];</p><p>  if (ch == '=')</p><p><b>  {</b></p><p>  words[j++] = ch;</p><p>  words[j] =

117、 '\0';</p><p>  flag = 13;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  i--;</

118、b></p><p>  flag = 13;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case';':

119、{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p>  flag = 15;</p><p><b>  break;</b></p><p><b>  }</b>

120、;</p><p><b>  case'(':{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p>  flag = 17;</p><p><b>  break;<

121、;/b></p><p><b>  }</b></p><p><b>  case')':{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p>  fl

122、ag = 17;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case'[':{</b></p><p>  words[j] = ch;</p><p>  wo

123、rds[j+1] = '\0';</p><p>  flag = 21;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case']':{</b></p>&

124、lt;p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p>  flag = 21;</p><p><b>  break;</b></p><p><b>  }</b></p><p>&l

125、t;b>  case'{':{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p>  flag = 20;</p><p><b>  break;</b></p><p

126、><b>  }</b></p><p><b>  case'}':{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p>  flag = 20;</p><

127、p><b>  break;</b></p><p><b>  }</b></p><p><b>  case':':{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';

128、</p><p>  flag = 22;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case',':{</b></p><p>  words[j] = ch;

129、</p><p>  words[j+1] = '\0';</p><p>  flag = 16;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case'#'

130、:{</b></p><p>  words[j] = ch;</p><p>  words[j+1] = '\0';</p><p><b>  flag = 0;</b></p><p><b>  break;</b></p><p>&l

131、t;b>  }</b></p><p>  case' '://空格</p><p><b>  {</b></p><p>  words[j] ='_';</p><p>  words[j+1] = '\0';</p><p>

132、;  flag = 24;</p><p><b>  break;</b></p><p><b>  }</b></p><p>  //case'$':{</p><p>  //words[j] = '#';</p><p>  //w

133、ords[j+1] = '\0';</p><p>  //flag = 0;</p><p><b>  //break;</b></p><p><b>  //}</b></p><p><b>  default:{</b></p><

134、;p>  flag = -1;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return flag;</p><p><b>  }

135、</b></p><p>  //------------------語法分析(遞歸下降)---------------------------</p><p><b>  void E();</b></p><p>  void E1();</p><p>  void E2();</p>&

136、lt;p>  void T(); </p><p>  void T1();</p><p>  void T2();</p><p><b>  void F();</b></p><p>  void F1();</p><p><b>  void P();</b>

137、;</p><p><b>  void E()</b></p><p><b>  {</b></p><p>  cout<<"E->TE''"<<endl;</p><p><b>  T();</b>&l

138、t;/p><p><b>  E2();</b></p><p><b>  }</b></p><p><b>  void E1()</b></p><p><b>  {</b></p><p>  if(flags[temp]=

139、=9) //加號</p><p><b>  {</b></p><p>  cout<<"E'->+T"<<endl;</p><p><b>  temp++;</b></p><p><b>  T();</b&g

140、t;</p><p><b>  }</b></p><p>  else if(flags[temp]==12)//減號</p><p><b>  {</b></p><p>  cout<<"E'->-T"<<endl;</p&g

141、t;<p><b>  temp++;</b></p><p><b>  T();</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  is_right=0;</p>

142、<p><b>  }</b></p><p><b>  void E2()</b></p><p><b>  {</b></p><p>  if(flags[temp]==9||flags[temp]==12)//如果是加或減</p><p><b&

143、gt;  {</b></p><p>  cout<<"E''->E'E''"<<endl;</p><p><b>  E1();</b></p><p><b>  E2();</b></p><p

144、><b>  }</b></p><p>  else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非)</p><p><b>  {</b></p><p>  cout<<"E''->ε"<<endl;

145、</p><p><b>  return ;</b></p><p><b>  }</b></p><p><b>  else</b></p><p>  is_right=0;</p><p><b>  }</b><

146、/p><p><b>  void T()</b></p><p><b>  {</b></p><p>  cout<<"T->FT''"<<endl;</p><p><b>  F();</b></p&

147、gt;<p><b>  T2();</b></p><p><b>  }</b></p><p><b>  void T1()</b></p><p><b>  {</b></p><p>  if(flags[temp]==10)

148、 //乘號</p><p><b>  {</b></p><p>  cout<<"T'->*F"<<endl;</p><p><b>  temp++;</b></p><p><b>  F();</b>

149、;</p><p><b>  }</b></p><p>  else if(flags[temp]==13) //除號</p><p><b>  {</b></p><p>  cout<<"T'->/F"<<endl;</p&

150、gt;<p><b>  temp++;</b></p><p><b>  F();</b></p><p><b>  }</b></p><p>  else is_right=0;</p><p><b>  }</b></p&

151、gt;<p><b>  void T2()</b></p><p><b>  {</b></p><p>  if(flags[temp]==10||flags[temp]==13)//如果是乘或除</p><p><b>  {</b></p><p>  

152、cout<<"T''->T'T''"<<endl;</p><p><b>  T1();</b></p><p><b>  T2();</b></p><p><b>  }</b></p>&

153、lt;p>  else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非)</p><p><b>  {</b></p><p>  cout<<"T''->ε"<<endl;</p><p><b>  return

154、;</b></p><p><b>  }</b></p><p>  else is_right=0;</p><p><b>  }</b></p><p><b>  void F()</b></p><p><b>  {&

155、lt;/b></p><p>  cout<<"F->PF'"<<endl;</p><p><b>  P();</b></p><p><b>  F1();</b></p><p><b>  }</b>&l

156、t;/p><p><b>  void F1()</b></p><p><b>  {</b></p><p>  if(flags[temp]==11) //乘方</p><p><b>  {</b></p><p>  cout<&

157、lt;"F'->**F"<<endl;</p><p><b>  temp++;</b></p><p><b>  F();</b></p><p><b>  }</b></p><p>  else if (flags[te

溫馨提示

  • 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

提交評論