版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計任務書</b></p><p> 學生姓名:_____ 專業(yè)班級:</p><p> 指導教師:_ 工作單位:計算機科學與技術學院 </p><p> 題目: IF-ELSE條件語句的翻譯程序設計(簡單優(yōu)先法、輸出四元式)</p><p><b> 初始
2、條件:</b></p><p> 理論:學完編譯課程,掌握一種計算機高級語言的使用。</p><p> 實踐:計算機實驗室提供計算機及軟件環(huán)境。如果自己有計算機可以在其上進行設計。</p><p> 要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)</p><p> 寫出符合給定的語法分析
3、方法的文法及屬性文法。</p><p> 完成題目要求的中間代碼四元式的描述。</p><p> 寫出給定的語法分析方法的思想,完成語法分析和語義分析程序設計。</p><p> 編制好分析程序后,設計若干用例,上機測試并通過所設計的分析程序。</p><p> 設計報告格式按附件要求書寫。課程設計報告書正文的內容應包括:</p
4、><p> 1 系統(tǒng)描述(問題域描述);</p><p> 2 文法及屬性文法的描述;</p><p> 3 語法分析方法描述及語法分析表設計;</p><p> 4 按給定的題目給出中間代碼形式的描述及中間代碼序列的結構設計;</p><p> 5 編譯系統(tǒng)的概要設計;</p><p>
5、 6 詳細的算法描述(流程圖或偽代碼);</p><p> 7 軟件的測試方法和測試結果;</p><p> 8 研制報告(研制過程,本設計的評價、特點、不足、收獲與體會等);</p><p> 9 參考文獻(按公開發(fā)表的規(guī)范書寫)。</p><p><b> 時間安排:</b></p><
6、p> 設計安排一周:周1、周2:完成系統(tǒng)分析及設計。</p><p> 周3、周4:完成程序調試及測試。</p><p> 周5:撰寫課程設計報告。</p><p> 設計驗收安排:設計周的星期五第1節(jié)課開始到實驗室進行上機驗收。</p><p> 設計報告書收取時間:設計周的次周星期一上午10點。</p>&l
7、t;p> 指導教師簽名: 2012年 10月 23日</p><p> 系主任(或責任教師)簽名: 2012年 10月 23日</p><p> IF-ELSE條件語句的翻譯程序設計</p><p> ?。ê唵蝺?yōu)先法、輸出四元式)</p><p>
8、<b> 1系統(tǒng)描述</b></p><p><b> 1.1實驗目的</b></p><p> 對條件語句:IF <布爾表達式> THEN <賦值語句> ELSE <賦值語句></p><p> 按給定的題目寫出符合語法分析方法要求的文法和屬性文法描述。</p>
9、<p> 按給定的題目給出語法分析方法的思想及分析表的設計。</p><p> 按給定題目給出中間代碼序列的結構設計。</p><p> 完成相應的詞法分析、語法分析和語義分析程序設計。</p><p> 編制好分析程序后,設計若干用例,上機測試并通過所設計的分析程序。</p><p><b> 1.2開發(fā)平臺&
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布爾表達式,B為賦值表達式,C為算術表達式</p><p><b> 2.2屬性文法描述</b></p><p> ?。?)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> ?。?)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語義分
17、析方法的描述及分析表設計</p><p><b> 3.1優(yōu)先關系定義</b></p><p> X=Y表示X和Y的優(yōu)先關系相等</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、當且僅當G中存在產生式規(guī)則A->…XY…</p><p> ?。?)X>Y當且僅當G中存在產生式規(guī)則A->…XB…,B=>Y…,B≠Y</p><p> (3)X<Y當且僅當G中存在產生式規(guī)則A->…BD…,B=>…X,B≠X,D=>Y…</p><p> 3.2簡單優(yōu)先文法定義</p><
19、p> 若一個文法是簡單優(yōu)先文法必須滿足以下條件:</p><p> 在文法符號集V中,任意兩個符號之間最多只有一種優(yōu)先關系成立</p><p> 在文法中任意兩個產生式沒有相同的右部</p><p> 其中第一條是必須滿足的,第二條若不滿足則會導致規(guī)約不唯一。</p><p> 3.3簡單優(yōu)先文法的算法步驟</p>
20、<p> 首先根據已知優(yōu)先文法構造相應優(yōu)先關系矩陣,并將文法的產生式保存,設置符號棧S,算法步驟如下:</p><p> 將輸入符號串a1,a2…aN#依次逐個存入符號棧S中,直到遇到棧頂符號ai的優(yōu)先性>下一個帶輸入符號aj時為止。</p><p> 棧頂當前符號ai為句柄尾,由此向左在棧中找句柄的頭符號ak,即找到ak-1<ak為止。</p>
21、<p> 由句柄ak…ai在文法產生式中查找右部為ak…ai的產生式,若找到則用相應左部代替句柄,若找不到則為出錯,這是可以判定輸入串不是該文法的句子。</p><p> 重復上述(1)(2)(3)步驟直到規(guī)約完輸入符號串,棧中只剩下文法的開始符號為止。</p><p> 3.4語義分析方法描述</p><p> 語義分析采用基于屬性文法的翻譯
22、方案,即,在語法分析過程中每進行一次規(guī)約操作則對對應產生式進行語義計算。</p><p><b> 3.5分析表構造</b></p><p> 3.5.1優(yōu)先關系的計算</p><p> 3.5.1.1 定義集合</p><p> FA(S)={a|S=>a…,S≠a,a為文法符號}</p>
23、<p> LA(S)={a|S=>…a,S≠a,a為文法符號}</p><p> 3.5.1.2 改造后的優(yōu)先關系計算</p><p> 當文法中存在A->…XY…時,X=Y</p><p> 當文法中存在A->…XB…時,X<FA(B)</p><p> 當文法中存在A->…BD…時,LA(
24、B)>D且LA(B)>FA(D)</p><p> 3.5.2分析表結構</p><p> 分析表采用二維數(shù)組存儲方式,文法中的每一個符號對應數(shù)組a中的一個位置,</p><p> 而a[i][j]代表第i個和第j個的優(yōu)先關系:</p><p> ?。?)a[i][i]=0無優(yōu)先關系</p><p>
25、; ?。?)a[i][i]=1i對應元素優(yōu)先級小于j的</p><p> ?。?)a[i][i]=2i對應元素優(yōu)先級大于j的</p><p> (4)a[i][i]=3i對應元素優(yōu)先級等于j的</p><p> 而在分析過程中規(guī)約產生式的選擇則在語法分析過程中,在語法分析過程中實現(xiàn)。分析表最終結果如下:</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、間代碼形式描述及結構設計</p><p> 四元式是一種比較普遍采用的中間代碼形式。四元式的四個組成成分是:算符op,第一和第二運算對象ARG1和ARG2及運算結果RESULT。運算對象和運算結果有時指用戶自己定義的變量,有時指編譯程序引進的臨時變量。</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> (4)(=,t3,-,a)</p><p> 四元式和三元式的主要不同在于,四元式對中間結果的引用必須通過給定的名字,而三元式是通過產生中間結果的三元式編號。也就是說,四元式之間的聯(lián)系是通過臨時變量實現(xiàn)的。</p&g
36、t;<p> 5編譯系統(tǒng)的概要設計</p><p> 系統(tǒng)主要分為兩個模塊:詞法分析和語法分析(包括語義分析)。并且在分析過程中將詞法分析產生的單詞輸出到文件,語法分析過程中分析棧的變化情況輸出到文件。</p><p> 系統(tǒng)設計采用過程化的設計方法,將詞法分析、語法分析等功能模塊在獨立的過程中實現(xiàn)。</p><p><b> 系統(tǒng)概
37、要結構如下:</b></p><p><b> 預定義模塊</b></p><p><b> 詞法分析模塊</b></p><p><b> 語法分析模塊</b></p><p><b> 其他輔助模塊</b></p>&
38、lt;p> 主程序模塊(主要指程序入口函數(shù)main())</p><p> 各模塊調用關系如下:</p><p><b> 6算法描述</b></p><p><b> 6.1預定義模塊</b></p><p> 預定義模塊主要包括宏定義、常量定義、類型定義以及全局變量定義等。具體如
39、下:</p><p><b> ?。?)宏定義</b></p><p> #define OK 1 //正常</p><p> #define ERROR -1 //出錯</p><p> #define FAILURE -1 //分析失敗</p><p><b> (2)類型定
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;//輸出時的當前行號</p><p> char ch ; //當前字符</p><p> char
43、 allname[30][30];//單詞全名</p><p> char out[30][30];//保存單詞簡稱</p><p> att attname[40];//名字表</p><p> ?。?)優(yōu)先關系表初始化(見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),判斷單詞是否為關鍵字。</p><p><b> 分析算法如下描述:</b></p><p> while(true)</p>
45、;<p><b> {</b></p><p> 字符串存放臨時數(shù)組temp;</p><p> if(到文件末尾) break;</p><p> 讀取一個字符到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> 讀取下一個字符;
47、</b></p><p><b> }</b></p><p> 判斷temp是否為關鍵字,并根據判斷結果使temp入名字表并設置正確的屬性。</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> 讀取下一個字符;</b></p><p><
49、;b> }</b></p><p> temp入名字表并設置正確的屬性。</p><p><b> }</b></p><p> else if(ch為其他合法字符(如:>,<,=等等)) 填入名字表。</p><p> else 輸出錯誤,無法識別的字符。</p>
50、<p><b> }</b></p><p><b> 6.3語法分析</b></p><p> 語法分析主要為laynax(ofstream &f)函數(shù),其中,f為棧變化情況輸出文件。其他輔助函數(shù)為除judge(char *string)外的其他所有輔助函數(shù)。語法分析的過稱描述如下:</p><p&g
51、t;<b> 初始化分析棧;</b></p><p> while(還有單詞)</p><p><b> {</b></p><p> 判斷當前棧頂單詞與輸入單詞的優(yōu)先級;</p><p> if(<||=) 當前符號入棧</p><p> else if(
52、>)</p><p><b> {</b></p><p> while(棧頂元素優(yōu)先級等于輸入單詞)</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> 進行規(guī)約;</b></p><p><b> 進行語義規(guī)則計算;</b></p><p><b> 輸出棧的變化情況;</b></p><p> 使規(guī)約后單詞為新的輸入符號;</p><p><b> }<
55、/b></p><p><b> else</b></p><p><b> {</b></p><p><b> 輸出規(guī)約出錯;</b></p><p><b> }</b></p><p><b> }
56、</b></p><p><b> else</b></p><p><b> {</b></p><p><b> 輸出輸入單詞錯誤;</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));//分配存儲空間 </p><p> if(!S.base) </p><p> exit(OVERFLOW); //為棧S
59、分配存儲空間失敗 </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("分配存儲單元失敗.\n"); //存儲單元分配失敗 </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送入棧頂指針所指向的單元,再將棧頂指針加 </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<<"???,出錯"<<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> {//輸出棧當前情況</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> {//判斷是否是關鍵字</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> 主程序主要負責,用戶界面的初始化,以及程序執(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ō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("輸入源文件名錯誤!\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("輸入文件名錯誤!
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("輸入文件名錯誤!\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測試方法和結果</b></p><p><b> 7.1測試方法</b></p><p> ?。?)程序設計過程中采用單步測試的方法,每完成一個獨立的功能模塊則對其進行單獨測試。各模塊測試成功之后,則對程序整體進行測試。</p><p>
106、 (2)程序整體測試時,利用多種變化的輸入數(shù)據進行測試,以驗證程序的正確性,并且提供錯誤的輸入來觀察程序的反應。</p><p><b> 7.2測試結果</b></p><p> 7.2.1程序運行界面</p><p> 7.2.2測試一(正確數(shù)據)</p><p><b> ?。?)輸入數(shù)據<
107、/b></p><p><b> (2)輸出結果</b></p><p><b> 單詞輸出(部分):</b></p><p> 分析棧輸出(部分):</p><p><b> 四元式輸出:</b></p><p> 7.2.3測試二(不
108、正確數(shù)據)</p><p><b> 輸入數(shù)據:</b></p><p><b> 輸出結果:</b></p><p><b> 8設計總結</b></p><p><b> 8.1設計優(yōu)點</b></p><p> ?。?
109、)簡單優(yōu)先分析法是一種規(guī)范規(guī)約。具有準確、規(guī)范等優(yōu)點。</p><p> (2)四元式為普遍的中間代碼形式。</p><p> (3)程序結構清晰,功能模塊劃分合理。</p><p> ?。?)程序具有堅實的基礎,可擴展性強。</p><p><b> 8.2設計缺點</b></p><p>
110、; ?。?)規(guī)范規(guī)約本身具有效率低的缺點。</p><p> (2)分析表結構龐大,占據大量內存空間,但其中卻有好多冗余。</p><p> ?。?)程序只能進行簡單的if-else語句進行翻譯,功能有限。</p><p> ?。?)程序容錯能力較差,遇到輸入錯誤時,只能進行簡單處理,即,終止程序。在極端情況下可能導致不可預知錯誤。</p><
111、p><b> 8.3考慮改進</b></p><p> (1)使用算符優(yōu)先分析法代替簡單優(yōu)先分析方法。</p><p> ?。?)采用優(yōu)先鏈的方式存儲優(yōu)先表,代替數(shù)組。</p><p> ?。?)提高程序的容錯能力。例如:遇到錯誤時,將錯誤文法盡可能補全為正確文法,使分析能夠繼續(xù)進行。</p><p> ?。?
112、)增強程序的功能,使其能適應復雜的源程序輸入。</p><p><b> 9收獲與體會</b></p><p> 本次課程設計可以說是對編譯原理課程本學期所學內容的一次綜合應用,雖然稱不上一個完整的編譯程序,但已經展現(xiàn)了一個完整編譯程序的雛形。通過本次課程設計,不僅進一步熟悉了編譯程序所涉及的各方面知識,更掌握了一個編譯程序的整體架構方式以及編譯程序構造的整體流程
113、。并且,從中認識到,編譯程序模塊化(詞法分析、語法分析、語義分析等)的重要,更是程序設計模塊化的重要。但,在其過程中也暴漏了自身知識的匱乏,包括,編譯原理知識學習不扎實,不能很好的運用;編程語言運用不熟練,導致頻繁因查找編程語言語法知識耗費大量時間等等。但總的來說,本次編程還是收獲不少,不僅僅是實現(xiàn)了課程設計所要求的內容,更為以后深入的學習(包括課程相關與不相關)打下了堅實的基礎。</p><p><b&g
114、t; 10參考文獻</b></p><p> 張素琴、呂映芝、蔣維杜、戴桂蘭等.編譯原理(第二版).清華大學出版社.2005</p><p> 閔聯(lián)營、何克右. C++程序設計教程. 武漢理工大學出版社. 2005</p><p> Stanley B.Lippman、Josee Lajoie、Barbara E.Moo著,李師賢、蔣愛軍、梅曉勇
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯課程設計報告---for循環(huán)語句的翻譯程序設計
- 編譯原理課程設計報告說明書--- do-while循環(huán)語句的翻譯程序設計
- 編譯原理課程設計-while循環(huán)語句的翻譯程序設計(lr方法、輸出四元式)
- 編譯原理課程設計---賦值語句的解釋程序設計
- 編譯原理課程設計---小型程序設計語言編譯器的設計與實現(xiàn)
- 編譯原理課程設計報告-編譯程序構造
- 編譯原理課程設計--- 詞法分析程序
- 課程設計---編譯原理實現(xiàn)對for語句處理的功能
- 編譯原理課程設計報告-預測分析程序的設計
- 編譯原理課程設計報告-預測分析程序的設計
- for循環(huán)語句的翻譯程序設計(遞歸下降法、輸出三地址表示
- 編譯原理課程設計
- 編譯原理課程設計
- 微機原理課程設計----進制轉換程序設計
- 組成原理課程設計報告---微程序設計
- 微機原理課程設計--代碼轉換程序設計
- 微機原理課程設計--加密解密程序設計
- 微機原理-課程設計電風扇程序設計
- 編譯原理遞歸下降子程序課程設計報告
- 編譯原理課程設計--算術表達式的語法分析及語義分析程序設計
評論
0/150
提交評論