版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- c語言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報告(一個完整的編譯器)
- 編譯原理課程設(shè)計(jì)____c語言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)報告--pl0編譯器的擴(kuò)充
- 編譯原理課程設(shè)計(jì)---c語言編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---簡單編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)-pl_0編譯器及其擴(kuò)充
- 編譯原理課程的設(shè)計(jì)--c語言編譯器
- 編譯原理課程設(shè)計(jì)報告-簡單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---s語言的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)___c語言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 編譯原理課程設(shè)計(jì)---一個簡單編譯器的設(shè)計(jì)與分析
- 編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語言編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報告
評論
0/150
提交評論