編譯原理課程設(shè)計(jì)--if-else條件語(yǔ)句的翻譯程序設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  課程設(shè)計(jì)任務(wù)書</b></p><p>  學(xué)生姓名:_____ 專業(yè)班級(jí):</p><p>  指導(dǎo)教師:_ 工作單位:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p>  題目: IF-ELSE條件語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu)先法、輸出四元式)</p><p><b>  初始

2、條件:</b></p><p>  理論:學(xué)完編譯課程,掌握一種計(jì)算機(jī)高級(jí)語(yǔ)言的使用。</p><p>  實(shí)踐:計(jì)算機(jī)實(shí)驗(yàn)室提供計(jì)算機(jī)及軟件環(huán)境。如果自己有計(jì)算機(jī)可以在其上進(jìn)行設(shè)計(jì)。</p><p>  要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書撰寫等具體要求)</p><p>  寫出符合給定的語(yǔ)法分析

3、方法的文法及屬性文法。</p><p>  完成題目要求的中間代碼四元式的描述。</p><p>  寫出給定的語(yǔ)法分析方法的思想,完成語(yǔ)法分析和語(yǔ)義分析程序設(shè)計(jì)。</p><p>  編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。</p><p>  設(shè)計(jì)報(bào)告格式按附件要求書寫。課程設(shè)計(jì)報(bào)告書正文的內(nèi)容應(yīng)包括:</p

4、><p>  1 系統(tǒng)描述(問(wèn)題域描述);</p><p>  2 文法及屬性文法的描述;</p><p>  3 語(yǔ)法分析方法描述及語(yǔ)法分析表設(shè)計(jì);</p><p>  4 按給定的題目給出中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計(jì);</p><p>  5 編譯系統(tǒng)的概要設(shè)計(jì);</p><p>

5、  6 詳細(xì)的算法描述(流程圖或偽代碼);</p><p>  7 軟件的測(cè)試方法和測(cè)試結(jié)果;</p><p>  8 研制報(bào)告(研制過(guò)程,本設(shè)計(jì)的評(píng)價(jià)、特點(diǎn)、不足、收獲與體會(huì)等);</p><p>  9 參考文獻(xiàn)(按公開發(fā)表的規(guī)范書寫)。</p><p><b>  時(shí)間安排:</b></p><

6、p>  設(shè)計(jì)安排一周:周1、周2:完成系統(tǒng)分析及設(shè)計(jì)。</p><p>  周3、周4:完成程序調(diào)試及測(cè)試。</p><p>  周5:撰寫課程設(shè)計(jì)報(bào)告。</p><p>  設(shè)計(jì)驗(yàn)收安排:設(shè)計(jì)周的星期五第1節(jié)課開始到實(shí)驗(yàn)室進(jìn)行上機(jī)驗(yàn)收。</p><p>  設(shè)計(jì)報(bào)告書收取時(shí)間:設(shè)計(jì)周的次周星期一上午10點(diǎn)。</p>&l

7、t;p>  指導(dǎo)教師簽名: 2012年 10月 23日</p><p>  系主任(或責(zé)任教師)簽名: 2012年 10月 23日</p><p>  IF-ELSE條件語(yǔ)句的翻譯程序設(shè)計(jì)</p><p>  (簡(jiǎn)單優(yōu)先法、輸出四元式)</p><p>

8、<b>  1系統(tǒng)描述</b></p><p><b>  1.1實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  對(duì)條件語(yǔ)句:IF <布爾表達(dá)式> THEN <賦值語(yǔ)句> ELSE <賦值語(yǔ)句></p><p>  按給定的題目寫出符合語(yǔ)法分析方法要求的文法和屬性文法描述。</p>

9、<p>  按給定的題目給出語(yǔ)法分析方法的思想及分析表的設(shè)計(jì)。</p><p>  按給定題目給出中間代碼序列的結(jié)構(gòu)設(shè)計(jì)。</p><p>  完成相應(yīng)的詞法分析、語(yǔ)法分析和語(yǔ)義分析程序設(shè)計(jì)。</p><p>  編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。</p><p><b>  1.2開發(fā)平臺(tái)&

10、lt;/b></p><p>  Visual C++ 6.0、Windows XP</p><p>  2文法及屬性文法的描述</p><p><b>  2.1文法描述</b></p><p>  (1) S->if E then B else B</p><p>  (2) E-

11、>(A>A)</p><p>  (3) E->(A<A)</p><p>  (4) E->(A)</p><p><b>  (5) A->d</b></p><p>  (6) A->num</p><p>  (7) B->{d=C}<

12、/p><p>  (8) C->A+A</p><p>  (9) C->A-A</p><p>  (10) C->A*A</p><p>  (11) C->A/A</p><p><b>  (12) C->A</b></p><p>  其

13、中,d代表變量,num代表常量(這里僅限數(shù)字),E布爾表達(dá)式,B為賦值表達(dá)式,C為算術(shù)表達(dá)式</p><p><b>  2.2屬性文法描述</b></p><p>  (1)E->A rop A’{E.true=nextstat;</p><p>  E.codebegin=nextstat;</p><p>

14、  E.false=nextstat+1;</p><p>  emit(“if” A.place “rop” A’.place “goto” -);</p><p>  emit(“goto” -)}</p><p>  (2)E->(A){E.place=A.place}</p><p> ?。?)A->id{p=loo

15、kup(id.name);</p><p>  if p!=null then</p><p><b>  A.place=p</b></p><p>  else error}</p><p> ?。?)B->{d=C}{d.place=C.place}</p><p> ?。?)C-

16、>A op A’{C.place=newtemp;</p><p>  emit(C.place “=” A.place “op” A’.place)}</p><p> ?。?)C->A{C.place=A.place}</p><p>  注:rop為>或<;op為+、-、*或/</p><p>  3語(yǔ)義分

17、析方法的描述及分析表設(shè)計(jì)</p><p><b>  3.1優(yōu)先關(guān)系定義</b></p><p>  X=Y表示X和Y的優(yōu)先關(guān)系相等</p><p>  X>Y表示X的優(yōu)先性比Y的優(yōu)先性大</p><p>  X<Y表示X的優(yōu)先性比Y的優(yōu)先性小</p><p> ?。?)X=Y

18、當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則A->…XY…</p><p> ?。?)X>Y當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則A->…XB…,B=>Y…,B≠Y</p><p> ?。?)X<Y當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則A->…BD…,B=>…X,B≠X,D=>Y…</p><p>  3.2簡(jiǎn)單優(yōu)先文法定義</p><

19、p>  若一個(gè)文法是簡(jiǎn)單優(yōu)先文法必須滿足以下條件:</p><p>  在文法符號(hào)集V中,任意兩個(gè)符號(hào)之間最多只有一種優(yōu)先關(guān)系成立</p><p>  在文法中任意兩個(gè)產(chǎn)生式?jīng)]有相同的右部</p><p>  其中第一條是必須滿足的,第二條若不滿足則會(huì)導(dǎo)致規(guī)約不唯一。</p><p>  3.3簡(jiǎn)單優(yōu)先文法的算法步驟</p>

20、<p>  首先根據(jù)已知優(yōu)先文法構(gòu)造相應(yīng)優(yōu)先關(guān)系矩陣,并將文法的產(chǎn)生式保存,設(shè)置符號(hào)棧S,算法步驟如下:</p><p>  將輸入符號(hào)串a(chǎn)1,a2…aN#依次逐個(gè)存入符號(hào)棧S中,直到遇到棧頂符號(hào)ai的優(yōu)先性>下一個(gè)帶輸入符號(hào)aj時(shí)為止。</p><p>  棧頂當(dāng)前符號(hào)ai為句柄尾,由此向左在棧中找句柄的頭符號(hào)ak,即找到ak-1<ak為止。</p>

21、<p>  由句柄ak…ai在文法產(chǎn)生式中查找右部為ak…ai的產(chǎn)生式,若找到則用相應(yīng)左部代替句柄,若找不到則為出錯(cuò),這是可以判定輸入串不是該文法的句子。</p><p>  重復(fù)上述(1)(2)(3)步驟直到規(guī)約完輸入符號(hào)串,棧中只剩下文法的開始符號(hào)為止。</p><p>  3.4語(yǔ)義分析方法描述</p><p>  語(yǔ)義分析采用基于屬性文法的翻譯

22、方案,即,在語(yǔ)法分析過(guò)程中每進(jìn)行一次規(guī)約操作則對(duì)對(duì)應(yīng)產(chǎn)生式進(jìn)行語(yǔ)義計(jì)算。</p><p><b>  3.5分析表構(gòu)造</b></p><p>  3.5.1優(yōu)先關(guān)系的計(jì)算</p><p>  3.5.1.1 定義集合</p><p>  FA(S)={a|S=>a…,S≠a,a為文法符號(hào)}</p>

23、<p>  LA(S)={a|S=>…a,S≠a,a為文法符號(hào)}</p><p>  3.5.1.2 改造后的優(yōu)先關(guān)系計(jì)算</p><p>  當(dāng)文法中存在A->…XY…時(shí),X=Y</p><p>  當(dāng)文法中存在A->…XB…時(shí),X<FA(B)</p><p>  當(dāng)文法中存在A->…BD…時(shí),LA(

24、B)>D且LA(B)>FA(D)</p><p>  3.5.2分析表結(jié)構(gòu)</p><p>  分析表采用二維數(shù)組存儲(chǔ)方式,文法中的每一個(gè)符號(hào)對(duì)應(yīng)數(shù)組a中的一個(gè)位置,</p><p>  而a[i][j]代表第i個(gè)和第j個(gè)的優(yōu)先關(guān)系:</p><p> ?。?)a[i][i]=0無(wú)優(yōu)先關(guān)系</p><p>

25、;  (2)a[i][i]=1i對(duì)應(yīng)元素優(yōu)先級(jí)小于j的</p><p> ?。?)a[i][i]=2i對(duì)應(yīng)元素優(yōu)先級(jí)大于j的</p><p> ?。?)a[i][i]=3i對(duì)應(yīng)元素優(yōu)先級(jí)等于j的</p><p>  而在分析過(guò)程中規(guī)約產(chǎn)生式的選擇則在語(yǔ)法分析過(guò)程中,在語(yǔ)法分析過(guò)程中實(shí)現(xiàn)。分析表最終結(jié)果如下:</p><p>  int

26、anltable[22][22]={</p><p>  /*S*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},</p><p>  /*if*/{0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p>  /*E*/{0,0,0,3,0,0,0,0,0,0,0

27、,0,0,0,0,0,0,0,0,0,0,0},</p><p>  /*then*/{0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},</p><p>  /*B*/{0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},</p><p>  /*else*/{0,0,0,0,3,0,

28、0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},</p><p>  /*(*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p>  /*)*/{0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p>  /*>*/{0,0,

29、0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p>  /*<*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p>  /*=*/{0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,0,0,0,0,0,0,0},</p><p>  /*A

30、*/{0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,2,3,3,3,3,0},</p><p>  /*d*/{0,0,0,0,0,0,0,2,2,2,3,0,0,0,0,0,2,2,2,2,2,0},</p><p>  /*num*/{0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0},</p><p>

31、;  /*C*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0},</p><p>  /*{*/{0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0},</p><p>  /*}*/{0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},</p><

32、;p>  /*+*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p>  /*_*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p>  /***/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p>

33、<p>  /*/*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p>  /*#*/{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p>  };//0-error ,1=<, 2=> ,3==</p><p>  4中

34、間代碼形式描述及結(jié)構(gòu)設(shè)計(jì)</p><p>  四元式是一種比較普遍采用的中間代碼形式。四元式的四個(gè)組成成分是:算符op,第一和第二運(yùn)算對(duì)象ARG1和ARG2及運(yùn)算結(jié)果RESULT。運(yùn)算對(duì)象和運(yùn)算結(jié)果有時(shí)指用戶自己定義的變量,有時(shí)指編譯程序引進(jìn)的臨時(shí)變量。</p><p>  例如:a=b*c+b*d的四元式表示如下:</p><p> ?。?)(*,b,c,t1)&

35、lt;/p><p> ?。?)(*,b,d,t2)</p><p> ?。?)(+,t1,t2,t3)</p><p> ?。?)(=,t3,-,a)</p><p>  四元式和三元式的主要不同在于,四元式對(duì)中間結(jié)果的引用必須通過(guò)給定的名字,而三元式是通過(guò)產(chǎn)生中間結(jié)果的三元式編號(hào)。也就是說(shuō),四元式之間的聯(lián)系是通過(guò)臨時(shí)變量實(shí)現(xiàn)的。</p&g

36、t;<p>  5編譯系統(tǒng)的概要設(shè)計(jì)</p><p>  系統(tǒng)主要分為兩個(gè)模塊:詞法分析和語(yǔ)法分析(包括語(yǔ)義分析)。并且在分析過(guò)程中將詞法分析產(chǎn)生的單詞輸出到文件,語(yǔ)法分析過(guò)程中分析棧的變化情況輸出到文件。</p><p>  系統(tǒng)設(shè)計(jì)采用過(guò)程化的設(shè)計(jì)方法,將詞法分析、語(yǔ)法分析等功能模塊在獨(dú)立的過(guò)程中實(shí)現(xiàn)。</p><p><b>  系統(tǒng)概

37、要結(jié)構(gòu)如下:</b></p><p><b>  預(yù)定義模塊</b></p><p><b>  詞法分析模塊</b></p><p><b>  語(yǔ)法分析模塊</b></p><p><b>  其他輔助模塊</b></p>&

38、lt;p>  主程序模塊(主要指程序入口函數(shù)main())</p><p>  各模塊調(diào)用關(guān)系如下:</p><p><b>  6算法描述</b></p><p><b>  6.1預(yù)定義模塊</b></p><p>  預(yù)定義模塊主要包括宏定義、常量定義、類型定義以及全局變量定義等。具體如

39、下:</p><p><b> ?。?)宏定義</b></p><p>  #define OK 1 //正常</p><p>  #define ERROR -1 //出錯(cuò)</p><p>  #define FAILURE -1 //分析失敗</p><p><b> ?。?)類型定

40、義</b></p><p>  struct att</p><p><b>  {//名字表類型</b></p><p>  string sname;</p><p>  char select;</p><p>  char addre;</p><p>

41、<b>  };</b></p><p>  typedef struct SqStack </p><p><b>  { </b></p><p>  char *base; </p><p>  char *top; </p><p> 

42、 int stacksize; </p><p>  }SqStack;//棧定義</p><p><b> ?。?)全局變量</b></p><p>  int lineno = 1;//輸出時(shí)的當(dāng)前行號(hào)</p><p>  char ch ; //當(dāng)前字符</p><p>  char

43、 allname[30][30];//單詞全名</p><p>  char out[30][30];//保存單詞簡(jiǎn)稱</p><p>  att attname[40];//名字表</p><p> ?。?)優(yōu)先關(guān)系表初始化(見(jiàn)3.5.2)</p><p><b>  6.2詞法分析</b></p>&l

44、t;p>  詞法分析主要為analysis(ifstream &fin,ofstream &fout)函數(shù),其中fin為輸入文件流,fout為單詞輸出文件流。輔助函數(shù)為judge(char *string),判斷單詞是否為關(guān)鍵字。</p><p><b>  分析算法如下描述:</b></p><p>  while(true)</p>

45、;<p><b>  {</b></p><p>  字符串存放臨時(shí)數(shù)組temp;</p><p>  if(到文件末尾) break;</p><p>  讀取一個(gè)字符到ch;</p><p>  if(ch是換行) {lineno+=1;}</p><p>  else if(c

46、h是字符)</p><p><b>  {</b></p><p>  while(ch是字符或數(shù)字)</p><p><b>  {</b></p><p><b>  ch存入temp;</b></p><p><b>  讀取下一個(gè)字符;

47、</b></p><p><b>  }</b></p><p>  判斷temp是否為關(guān)鍵字,并根據(jù)判斷結(jié)果使temp入名字表并設(shè)置正確的屬性。</p><p><b>  }</b></p><p>  else if(ch是數(shù)字)</p><p><b

48、>  {</b></p><p>  while(ch是數(shù)字)</p><p><b>  {</b></p><p><b>  ch存入temp;</b></p><p><b>  讀取下一個(gè)字符;</b></p><p><

49、;b>  }</b></p><p>  temp入名字表并設(shè)置正確的屬性。</p><p><b>  }</b></p><p>  else if(ch為其他合法字符(如:>,<,=等等)) 填入名字表。</p><p>  else 輸出錯(cuò)誤,無(wú)法識(shí)別的字符。</p>

50、<p><b>  }</b></p><p><b>  6.3語(yǔ)法分析</b></p><p>  語(yǔ)法分析主要為laynax(ofstream &f)函數(shù),其中,f為棧變化情況輸出文件。其他輔助函數(shù)為除judge(char *string)外的其他所有輔助函數(shù)。語(yǔ)法分析的過(guò)稱描述如下:</p><p&g

51、t;<b>  初始化分析棧;</b></p><p>  while(還有單詞)</p><p><b>  {</b></p><p>  判斷當(dāng)前棧頂單詞與輸入單詞的優(yōu)先級(jí);</p><p>  if(<||=) 當(dāng)前符號(hào)入棧</p><p>  else if(

52、>)</p><p><b>  {</b></p><p>  while(棧頂元素優(yōu)先級(jí)等于輸入單詞)</p><p><b>  {</b></p><p><b>  保存輸入單詞;</b></p><p>  置輸入單詞為棧頂單詞;<

53、;/p><p><b>  棧頂元素出棧;</b></p><p><b>  }</b></p><p>  判斷保存單詞串是否為句柄;</p><p><b>  if(是句柄)</b></p><p><b>  {</b><

54、;/p><p><b>  進(jìn)行規(guī)約;</b></p><p><b>  進(jìn)行語(yǔ)義規(guī)則計(jì)算;</b></p><p><b>  輸出棧的變化情況;</b></p><p>  使規(guī)約后單詞為新的輸入符號(hào);</p><p><b>  }<

55、/b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  輸出規(guī)約出錯(cuò);</b></p><p><b>  }</b></p><p><b>  }

56、</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  輸出輸入單詞錯(cuò)誤;</b></p><p><b>  }</b></p><p><b&

57、gt;  }</b></p><p><b>  6.4其他模塊</b></p><p><b>  其他模塊描述如下:</b></p><p><b> ?。?)棧操作模塊</b></p><p>  void InitStack (SqStack &S)

58、 </p><p><b>  {//棧初始化</b></p><p>  S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));//分配存儲(chǔ)空間 </p><p>  if(!S.base) </p><p>  exit(OVERFLOW); //為棧S

59、分配存儲(chǔ)空間失敗 </p><p>  S.top=S.base; </p><p>  S.stacksize=STACK_INIT_SIZE; </p><p><b>  } </b></p><p>  int push(SqStack &S,char ch)//將元素e插入到棧S中,成

60、為新的棧頂元素 </p><p><b>  { </b></p><p>  if(S.top-S.base >S.stacksize) //判定棧是否滿</p><p><b>  { </b></p><p>  S.base=(char*)realloc(S.base,

61、(S.stacksize+STACKINCREMENT *sizeof(char))); </p><p>  if(!S.base) </p><p><b>  { </b></p><p>  printf("分配存儲(chǔ)單元失敗.\n"); //存儲(chǔ)單元分配失敗 </p><p&

62、gt;  exit(OVERFLOW); </p><p><b>  } </b></p><p>  S.top=S.base+S.stacksize; //指明棧頂指針的基址 </p><p>  S.stacksize+=STACKINCREMENT; //指明棧的空間大小 </p><p&g

63、t;<b>  } </b></p><p>  *S.top++=ch; //先將e送入棧頂指針?biāo)赶虻膯卧?,再將棧頂指針?</p><p>  return(OK); </p><p><b>  } </b></p><p>  int pop(SqStack &

64、S,char &ch) </p><p><b>  {//棧頂元素出棧</b></p><p>  if(S.top==S.base) </p><p><b>  { </b></p><p>  printf("溢出"); </p>

65、;<p>  return (ERROR); </p><p><b>  } </b></p><p>  ch=*--S.top; </p><p>  return(OK); </p><p><b>  } </b></p><p&

66、gt;  char gettop(SqStack S)</p><p>  { //返回棧頂元素</p><p>  if(S.top==S.base) cout<<"??眨鲥e(cuò)"<<endl;</p><p><b>  char e; </b></p><p>  e =

67、*(S.top-1); </p><p>  return e; </p><p><b>  }</b></p><p>  void printstack(SqStack &S,int naa,int ty,ofstream &fout)</p><p>  {//輸出棧當(dāng)前情況</p>

68、<p>  char temp[40][20];</p><p>  for(int k=0;k<40;k++)</p><p><b>  {</b></p><p>  for(int t=0;t<20;t++)</p><p>  temp[k][t]=NULL;</p>&l

69、t;p><b>  }</b></p><p><b>  int te=0;</b></p><p>  int i=0,j=0;</p><p><b>  int nu=0;</b></p><p><b>  char *ku;</b><

70、;/p><p>  ku=S.base;</p><p><b>  i=naa+1;</b></p><p>  char *contrl;</p><p>  contrl=S.base;</p><p>  while(contrl!=S.top)</p><p>&l

71、t;b>  {</b></p><p>  if(*contrl!='1')</p><p><b>  {</b></p><p>  if(*contrl=='i')</p><p>  {fout<<"if";nu=nu+2;}<

72、;/p><p>  else if(*contrl=='t')</p><p>  {fout<<"then";nu=nu+4;}</p><p>  else if(*contrl=='e')</p><p>  {fout<<"else";nu=n

73、u+4;}</p><p><b>  else</b></p><p>  {fout<<*contrl;nu++;}</p><p><b>  }</b></p><p><b>  contrl++;</b></p><p><

74、b>  }</b></p><p>  fout<<"\t\t\t";</p><p>  for(i;i<=length;i++)</p><p><b>  {</b></p><p>  if(gettop(S)=='S')</p>

75、<p>  fout<<"#";</p><p><b>  else</b></p><p>  fout<<attname[i].select;</p><p><b>  }</b></p><p>  if(gettop(S)==&

76、#39;S')</p><p>  fout<<"#";</p><p><b>  else</b></p><p>  fout<<temp[te];</p><p><b>  te++;</b></p><p>  

77、fout<<endl;</p><p><b>  }</b></p><p><b> ?。?)其他</b></p><p>  int getnum(char cc)</p><p>  {//返回元素在優(yōu)先表中的位置</p><p>  switch(cc)

78、</p><p><b>  {</b></p><p><b>  case 'S':</b></p><p>  return 0;break;</p><p><b>  case 'i':</b></p><p>

79、  return 1;break;</p><p><b>  case 'E':</b></p><p>  return 2;break;</p><p><b>  case 't':</b></p><p>  return 3;break;</p>

80、;<p><b>  case 'B':</b></p><p>  return 4;break;</p><p><b>  case 'e':</b></p><p>  return 5;break;</p><p><b>  cas

81、e '(':</b></p><p>  return 6;break;</p><p><b>  case ')':</b></p><p>  return 7;break;</p><p><b>  case '>':</b>

82、;</p><p>  return 8;break;</p><p><b>  case '<':</b></p><p>  return 9;break;</p><p><b>  case '=':</b></p><p> 

83、 return 10;break;</p><p><b>  case 'A':</b></p><p>  return 11;break;</p><p><b>  case 'd':</b></p><p>  return 12;break;</p&

84、gt;<p><b>  case 'n':</b></p><p>  return 13;break;</p><p><b>  case 'C':</b></p><p>  return 14;break;</p><p><b> 

85、 case '{':</b></p><p>  return 15;break;</p><p><b>  case '}':</b></p><p>  return 16;break;</p><p><b>  case '+':</b

86、></p><p>  return 17;break;</p><p><b>  case '-':</b></p><p>  return 18;break;</p><p><b>  case '*':</b></p><p>

87、;  return 19;break;</p><p><b>  case '/':</b></p><p>  return 20;break;</p><p><b>  case '#':</b></p><p>  return 21;break;</

88、p><p><b>  default:</b></p><p>  return 88;</p><p><b>  }</b></p><p><b>  }</b></p><p>  int judge(char *string) </p>

89、;<p>  {//判斷是否是關(guān)鍵字</p><p>  char *keywords[1000]={"if","then","else"};</p><p>  for(int i = 0;i <= 2;i++) </p><p><b>  {</b></

90、p><p>  if (!strcmp(string,*(keywords+i)))</p><p><b>  {</b></p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b> 

91、 }</b></p><p>  return 0; </p><p><b>  }</b></p><p><b>  6.5主程序</b></p><p>  主程序主要負(fù)責(zé),用戶界面的初始化,以及程序執(zhí)行控制。程序如下:</p><p>  int mai

92、n()</p><p><b>  {</b></p><p>  int test=0;</p><p>  cout<<"==============================================================================="<<endl;&

93、lt;/p><p>  cout<<"= IF-ELSE條件語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu)先法、輸出四元式) ="<<endl;</p><p>  cout<<"==================================================================

94、============="<<endl;</p><p>  char inFile[100],wordOutFile[100],stackFile[100];</p><p>  ifstream *fin;</p><p>  ofstream *wordOut,*stackOut;</p><p>  while

95、(true)</p><p><b>  {</b></p><p>  printf("輸入源文件名(包括路徑):");</p><p>  cin>>inFile;</p><p>  fin=new ifstream(inFile);</p><p>  if

96、(fin==NULL)</p><p><b>  {</b></p><p>  printf("輸入源文件名錯(cuò)誤!\n");</p><p><b>  continue;</b></p><p><b>  }</b></p><p

97、><b>  break;</b></p><p><b>  }</b></p><p>  while(true)</p><p><b>  {</b></p><p>  printf("輸入單詞輸出文件(包括路徑):");</p>

98、<p>  cin>>wordOutFile;</p><p>  wordOut=new ofstream(wordOutFile);</p><p>  if(wordOut==NULL)</p><p><b>  {</b></p><p>  printf("輸入文件名錯(cuò)誤!

99、\n");</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  wh

100、ile(true)</p><p><b>  {</b></p><p>  printf("輸入棧情況輸出文件(包括路徑):");</p><p>  cin>>stackFile;</p><p>  stackOut=new ofstream(stackFile);</p&g

101、t;<p>  if(stackOut==NULL)</p><p><b>  {</b></p><p>  printf("輸入文件名錯(cuò)誤!\n");</p><p><b>  continue;</b></p><p><b>  }</b

102、></p><p><b>  break;</b></p><p><b>  }</b></p><p>  getchar();</p><p>  test=analysis(*fin ,*wordOut);</p><p>  if(test==1)</

103、p><p><b>  {</b></p><p>  test=laynax(*stackOut);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  return 0;</b

104、></p><p>  if(test==1)</p><p><b>  {</b></p><p>  printfou();</p><p><b>  }</b></p><p>  return 0;</p><p><b>

105、;  }</b></p><p><b>  7測(cè)試方法和結(jié)果</b></p><p><b>  7.1測(cè)試方法</b></p><p> ?。?)程序設(shè)計(jì)過(guò)程中采用單步測(cè)試的方法,每完成一個(gè)獨(dú)立的功能模塊則對(duì)其進(jìn)行單獨(dú)測(cè)試。各模塊測(cè)試成功之后,則對(duì)程序整體進(jìn)行測(cè)試。</p><p>

106、 ?。?)程序整體測(cè)試時(shí),利用多種變化的輸入數(shù)據(jù)進(jìn)行測(cè)試,以驗(yàn)證程序的正確性,并且提供錯(cuò)誤的輸入來(lái)觀察程序的反應(yīng)。</p><p><b>  7.2測(cè)試結(jié)果</b></p><p>  7.2.1程序運(yùn)行界面</p><p>  7.2.2測(cè)試一(正確數(shù)據(jù))</p><p><b> ?。?)輸入數(shù)據(jù)<

107、/b></p><p><b> ?。?)輸出結(jié)果</b></p><p><b>  單詞輸出(部分):</b></p><p>  分析棧輸出(部分):</p><p><b>  四元式輸出:</b></p><p>  7.2.3測(cè)試二(不

108、正確數(shù)據(jù))</p><p><b>  輸入數(shù)據(jù):</b></p><p><b>  輸出結(jié)果:</b></p><p><b>  8設(shè)計(jì)總結(jié)</b></p><p><b>  8.1設(shè)計(jì)優(yōu)點(diǎn)</b></p><p> ?。?

109、)簡(jiǎn)單優(yōu)先分析法是一種規(guī)范規(guī)約。具有準(zhǔn)確、規(guī)范等優(yōu)點(diǎn)。</p><p> ?。?)四元式為普遍的中間代碼形式。</p><p> ?。?)程序結(jié)構(gòu)清晰,功能模塊劃分合理。</p><p>  (4)程序具有堅(jiān)實(shí)的基礎(chǔ),可擴(kuò)展性強(qiáng)。</p><p><b>  8.2設(shè)計(jì)缺點(diǎn)</b></p><p>

110、;  (1)規(guī)范規(guī)約本身具有效率低的缺點(diǎn)。</p><p>  (2)分析表結(jié)構(gòu)龐大,占據(jù)大量?jī)?nèi)存空間,但其中卻有好多冗余。</p><p> ?。?)程序只能進(jìn)行簡(jiǎn)單的if-else語(yǔ)句進(jìn)行翻譯,功能有限。</p><p> ?。?)程序容錯(cuò)能力較差,遇到輸入錯(cuò)誤時(shí),只能進(jìn)行簡(jiǎn)單處理,即,終止程序。在極端情況下可能導(dǎo)致不可預(yù)知錯(cuò)誤。</p><

111、p><b>  8.3考慮改進(jìn)</b></p><p> ?。?)使用算符優(yōu)先分析法代替簡(jiǎn)單優(yōu)先分析方法。</p><p>  (2)采用優(yōu)先鏈的方式存儲(chǔ)優(yōu)先表,代替數(shù)組。</p><p> ?。?)提高程序的容錯(cuò)能力。例如:遇到錯(cuò)誤時(shí),將錯(cuò)誤文法盡可能補(bǔ)全為正確文法,使分析能夠繼續(xù)進(jìn)行。</p><p> ?。?

112、)增強(qiáng)程序的功能,使其能適應(yīng)復(fù)雜的源程序輸入。</p><p><b>  9收獲與體會(huì)</b></p><p>  本次課程設(shè)計(jì)可以說(shuō)是對(duì)編譯原理課程本學(xué)期所學(xué)內(nèi)容的一次綜合應(yīng)用,雖然稱不上一個(gè)完整的編譯程序,但已經(jīng)展現(xiàn)了一個(gè)完整編譯程序的雛形。通過(guò)本次課程設(shè)計(jì),不僅進(jìn)一步熟悉了編譯程序所涉及的各方面知識(shí),更掌握了一個(gè)編譯程序的整體架構(gòu)方式以及編譯程序構(gòu)造的整體流程

113、。并且,從中認(rèn)識(shí)到,編譯程序模塊化(詞法分析、語(yǔ)法分析、語(yǔ)義分析等)的重要,更是程序設(shè)計(jì)模塊化的重要。但,在其過(guò)程中也暴漏了自身知識(shí)的匱乏,包括,編譯原理知識(shí)學(xué)習(xí)不扎實(shí),不能很好的運(yùn)用;編程語(yǔ)言運(yùn)用不熟練,導(dǎo)致頻繁因查找編程語(yǔ)言語(yǔ)法知識(shí)耗費(fèi)大量時(shí)間等等。但總的來(lái)說(shuō),本次編程還是收獲不少,不僅僅是實(shí)現(xiàn)了課程設(shè)計(jì)所要求的內(nèi)容,更為以后深入的學(xué)習(xí)(包括課程相關(guān)與不相關(guān))打下了堅(jiān)實(shí)的基礎(chǔ)。</p><p><b&g

114、t;  10參考文獻(xiàn)</b></p><p>  張素琴、呂映芝、蔣維杜、戴桂蘭等.編譯原理(第二版).清華大學(xué)出版社.2005</p><p>  閔聯(lián)營(yíng)、何克右. C++程序設(shè)計(jì)教程. 武漢理工大學(xué)出版社. 2005</p><p>  Stanley B.Lippman、Josee Lajoie、Barbara E.Moo著,李師賢、蔣愛(ài)軍、梅曉勇

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論