版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 摘要</b></p><p> 使用過現(xiàn)代計(jì)算機(jī)的人都知道,多數(shù)用戶是應(yīng)用高級語言來實(shí)現(xiàn)他們所需要的計(jì)算的?,F(xiàn)在計(jì)算機(jī)系統(tǒng)一般都含有不只一個(gè)的高級語言的編譯程序,對有些高級語言甚至配置了幾個(gè)不同性能的編譯程序,供用戶按不同需要進(jìn)行選擇。高級語言編譯程序是計(jì)算機(jī)系統(tǒng)軟件最主要的組成部分之一,也是用戶最直接關(guān)系的工具之一。</p><p>
2、 計(jì)算機(jī)上執(zhí)行一個(gè)高級語言程序一般分為兩步:第一,用一個(gè)編譯程序把高級語言翻譯成機(jī)器語言程序;第二,運(yùn)行所得的機(jī)器語言程序求得計(jì)算結(jié)果。</p><p> 通常說的翻譯程序是指能夠把某一種語言程序轉(zhuǎn)換成另一種語言程序(目標(biāo)語言程序)。如果源語言諸如Fortran,Pascal,C,Ada或java這樣的高級語言,而目標(biāo)程序是諸如匯編語言或者機(jī)器語言這類的低級語言,這樣的一個(gè)翻譯程序就是稱為編譯程序。</
3、p><p> 一個(gè)編譯程序的工作過程一般可以劃分為五個(gè)階段:詞法分析、語法分析、語義分析與中間代碼生成、優(yōu)化、目標(biāo)代碼生成。每個(gè)階段都是從上一個(gè)階段得到結(jié)果,對他進(jìn)行分析,并且根據(jù)一些外部環(huán)境(例如符號(hào)表等)得到最終的輸出結(jié)果。要構(gòu)造一個(gè)編譯程序,可以按照這樣的階段來分別構(gòu)造,最后來連調(diào)。</p><p> 現(xiàn)在人們已經(jīng)建立了多種編制部分編譯程序或整個(gè)編譯程序的有效工具。有些能用于自動(dòng)生成
4、掃描器(如LEX),有些可以用于自動(dòng)產(chǎn)生語法分析器(如YACC),有些甚至可以用來自動(dòng)產(chǎn)生整個(gè)的編譯程序。這些構(gòu)造編譯程序的工具成為編譯程序-編譯程序、編譯程序產(chǎn)生器或翻譯程序書寫系統(tǒng),他們是按照編譯程序和目標(biāo)語言的形式描述而自動(dòng)產(chǎn)生編譯程序的。</p><p> 編譯程序是一極其龐大而又復(fù)雜的系統(tǒng),掌握它比較苦難。但是一旦對其掌握,對以后的程序語言設(shè)計(jì),系統(tǒng)軟件分析,系統(tǒng)軟件設(shè)計(jì),形式語言研究等方面都是非常有
5、好處的。</p><p> 關(guān)鍵字:C語言、、編譯、掃描器、語法分析</p><p><b> 一、需求分析</b></p><p> 給出類C語言(C語言的子集)的詞法和語法定義,并根據(jù)對應(yīng)的語法定義寫出一些屬性文法和語法制導(dǎo)。根據(jù)詞法和語法的定義,構(gòu)造一個(gè)編譯程序,它主要可以完成如下功能:</p><p>
6、1、讀入某個(gè)已經(jīng)編輯好的類C源程序文件,通過詞法分析器,生成二元組,同時(shí)檢查詞法錯(cuò)誤;</p><p> 2、語法分析器將產(chǎn)生的二元組作為輸入,進(jìn)行語法分析,同時(shí)檢查語法錯(cuò)誤;</p><p> 3、在語法分析同時(shí),利用屬性文法和語法制導(dǎo)技術(shù),產(chǎn)生具體的語意動(dòng)作,并對符號(hào)表進(jìn)行操作;</p><p> 4、根據(jù)語義動(dòng)作產(chǎn)生整個(gè)源程序的四元式序列;</p&
7、gt;<p> 5、將產(chǎn)生的四元式序列連同符號(hào)表一起輸出,作為編譯程序的最終輸出結(jié)果;</p><p> 6、對最后的代碼優(yōu)化和目標(biāo)代碼生成要有所考慮,必須留有一定的接口供以后擴(kuò)展;</p><p> 7、增大程序的可移植性,努力做到整個(gè)系統(tǒng)方便移植。</p><p><b> 二、詳細(xì)算法設(shè)計(jì)</b></p>
8、<p> 詞法分析程序 語法分析程序 語義分析程序 編譯器。</p><p><b> 三、流程圖</b></p><p> 圖 I 主函數(shù)示意圖</p><p> 圖 II 遞歸下降分析程序示意圖</p><p> 圖 IV 語句串分析示意圖</p><p> 圖
9、V 語句分析示意圖</p><p><b> 四、相關(guān)函數(shù)說明</b></p><p> void scanner(); //掃描</p><p> void lrparser(); </p><p> void staBlock(int *nChain); //語句塊</p><p>
10、 void staString(int *nChain); //語句串</p><p> void sta(int *nChain); //語句</p><p> void fuzhi(); //賦值語句</p><p> void tiaojian(int *nChain); //條件語句</p><p> void xunhuan
11、(); //循環(huán)語句</p><p> char* E(); //Expresiion表達(dá)式</p><p> char* T(); //Term項(xiàng)</p><p> char* F(); //Factor因子</p><p> char *newTemp(); //自動(dòng)生成臨時(shí)變量</p><p> voi
12、d 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><b> 五.運(yùn)行結(jié)果 </b&g
13、t;</p><p> 圖 VI 賦值語句的分析</p><p> 圖 VII 條件語句的分析</p><p> 圖 VIII 循環(huán)語句的分析</p><p><b> 圖 IX 綜合</b></p><p><b> 六.編譯器使用說明</b></p>
14、<p> 程序提示用戶輸入字符串“Please input your source string:”,用戶輸入字符串并以“#”號(hào)結(jié)束?;剀嚭?,程序顯示運(yùn)行結(jié)果。</p><p><b> 七.程序清單</b></p><p> #include<stdio.h></p><p> #include<str
15、ing.h></p><p> #include<math.h></p><p> #include<stdlib.h></p><p> char prog[80]; /* 存放所有輸入字符 */</p><p> char token[8]; /* 存放詞組 */</p>&
16、lt;p> char ch; /* 單個(gè)字符 */</p><p> int syn,p,m,n,i; /* syn:種別編碼 */</p><p> double sum; </p><p> int count; </p><p> int isSignal; /* 是否帶正負(fù)號(hào)(0不帶,1
17、負(fù)號(hào),2正號(hào)) */</p><p> int isError;</p><p> int isDecimal; /* 是否是小數(shù) */</p><p> double decimal; /* 小數(shù) */</p><p> int isExp; /* 是否是指數(shù) */</p><p>
18、int index; /* 指數(shù)冪 */</p><p> int isNegative; /* 是否帶負(fù)號(hào) */</p><p> double temp; </p><p> int temp2;</p><p> int repeat; /* 是否連續(xù)出現(xiàn)+,- */</p><p>
19、int nextq;</p><p> int kk; /* 臨時(shí)變量的標(biāo)號(hào) */</p><p> int ntc,nfc,nnc,nnb,nna;</p><p> char *rwtab[9]={"main","int","float","double","char
20、","if","else","do","while"};</p><p><b> struct{</b></p><p> char result[10]; /* 字符串(字符數(shù)組) */</p><p> char arg1[10];</p
21、><p> char opera[10];</p><p> char arg2[10];</p><p> }fourCom[20]; /* 結(jié)構(gòu)體數(shù)組 */</p><p> void scanner(); /* 掃描 */</p><p> void lrparser(); </p><
22、p> void staBlock(int *nChain); /* 語句塊 */</p><p> void staString(int *nChain); /* 語句串 */</p><p> void sta(int *nChain); /* 語句 */</p><p> void fuzhi(); /* 賦值語句 */</p>&l
23、t;p> void tiaojian(int *nChain); /* 條件語句 */</p><p> void xunhuan(); /* 循環(huán)語句 */</p><p> char* E(); /* Expresiion表達(dá)式 */</p><p> char* T(); /* Term項(xiàng) */</p><p> cha
24、r* F(); /* Factor因子 */</p><p> char *newTemp(); /* 自動(dòng)生成臨時(shí)變量 */</p><p> void backpatch(int p,int t); /* 回填 */</p><p> int merge(int p1,int p2); /* 合并p1和p2 */</p><p>
25、 void emit(char *res,char *num1,char *op,char *num2); /* 生成四元式 */</p><p> void main()</p><p><b> { p=0;</b></p><p><b> count=0;</b></p><p>
26、 isDecimal=0;</p><p><b> index=0;</b></p><p><b> repeat=0;</b></p><p><b> kk=0;</b></p><p> printf("\nPlease input your so
27、urce string:\n");</p><p> do{ch=getchar();</p><p> prog[p++]=ch;</p><p> }while(ch!='#');</p><p><b> p=0;</b></p><p> isError
28、=0;</p><p> scanner();</p><p> lrparser();</p><p> for(i=1;i<nextq;i++) /* 循環(huán)輸出四元式 */</p><p> {printf("\n%d\t",i);</p><p> printf("(
29、%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><p> void lrparser
30、()</p><p><b> {</b></p><p> int nChain;</p><p> nfc=ntc=1;</p><p><b> nextq=1;</b></p><p> if(syn==1) /* main */</p>&l
31、t;p><b> {</b></p><p> scanner();</p><p> if(syn==26) /* ( */</p><p> { scanner();</p><p> if(syn==27) /* ) */</p><p> { scanner();
32、</p><p> staBlock(&nChain);</p><p><b> }</b></p><p><b> else</b></p><p> printf("缺少右括號(hào)\n");</p><p><b> }&l
33、t;/b></p><p><b> else </b></p><p> printf("缺少左括號(hào)\n");</p><p><b> }</b></p><p><b> else</b></p><p> pr
34、intf("缺少main\n");</p><p> }/* <語句塊> ::= '{'<語句串>'}' */</p><p> void staBlock(int *nChain) /* 語句塊 */</p><p> { if(syn==28) /* { */</p&g
35、t;<p><b> {</b></p><p> scanner();</p><p> staString(nChain);</p><p> /* backpatch(*nChain,nextq); */</p><p> if(syn==29) /* } */</p><
36、;p> scanner(); /* 讀下一個(gè) */</p><p><b> else</b></p><p> printf("缺少}號(hào)\n");</p><p><b> }</b></p><p><b> else</b></
37、p><p> printf("缺少{號(hào)\n");</p><p><b> }</b></p><p> /* <語句串>::=<語句>{;<語句>}; */</p><p> void staString(int *nChain) /* 語句串 */</
38、p><p><b> {</b></p><p> sta(nChain);</p><p> backpatch(*nChain,nextq);</p><p> while(syn==31) /* ; */</p><p><b> {</b></p>
39、<p> scanner();</p><p> sta(nChain);</p><p><b> }</b></p><p> /* backpatch(*nChain,nextq-1); */</p><p><b> }</b></p><p>
40、 void sta(int *nChain) /* 語句 */</p><p><b> {</b></p><p> if(syn==10)</p><p><b> {</b></p><p><b> fuzhi();</b></p><p&
41、gt; /* *nChain=0; */</p><p><b> }</b></p><p> else if(syn==6) /* if */</p><p><b> {</b></p><p> tiaojian(nChain);</p><p><b
42、> }</b></p><p> else if(syn==8) /* do */</p><p> xunhuan();</p><p><b> }</b></p><p> /* <條件語句>->if(<條件>)<語句塊> */</p>
43、;<p> void tiaojian(int *nChain)</p><p><b> {</b></p><p> char res[10],num1[10],num2[10],op[10];</p><p> int nChainTemp;</p><p> /* <條件>-&
44、gt;<表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式> */</p><p> if(syn==6) /* if */</p><p><b> {</b></p><p> scanner();</p><p> /* strcpy(num1,E()); */</p><
45、;p> if(syn==26) /* ( */</p><p><b> {</b></p><p> scanner();</p><p> strcpy(num1,E());</p><p> if((syn<=37)&&(syn>=32)) </p><
46、;p><b> {</b></p><p> switch(syn)</p><p><b> {</b></p><p><b> case 32:</b></p><p> strcpy(op,">");</p>&l
47、t;p><b> break;</b></p><p><b> case 33:</b></p><p> strcpy(op,">=");</p><p><b> break;</b></p><p><b> case
48、 34:</b></p><p> strcpy(op,"<");</p><p><b> break;</b></p><p><b> case 35:</b></p><p> strcpy(op,"<=");</
49、p><p><b> break;</b></p><p><b> case 36:</b></p><p> strcpy(op,"==");</p><p><b> break;</b></p><p><b>
50、 case 37:</b></p><p> strcpy(op,"!=");</p><p><b> break;</b></p><p><b> default:</b></p><p> printf("error");<
51、/p><p><b> }</b></p><p><b> }</b></p><p> scanner();</p><p> strcpy(num2,E());</p><p> strcat(num1,op);</p><p> str
52、cat(num1,num2);</p><p> /* nfc=nextq+1; */</p><p> ntc=nextq; /* 記住if語句位置 */</p><p> emit("0","if",num1,"goto"); </p><p> nfc=nextq; /
53、* if中表達(dá)式為假 */</p><p> emit("0","","","goto");</p><p> /* 第一個(gè)0已回填 */</p><p> backpatch(ntc,nextq); /* ntc鏈接的所有四元式都回填nextq */</p><
54、;p><b> } </b></p><p> if(syn==27) /* ) */</p><p> scanner();</p><p> staBlock(&nChainTemp); /* 語句塊 */</p><p> *nChain=merge(nChainTemp,nfc);
55、</p><p><b> }</b></p><p><b> }</b></p><p> /* <循環(huán)語句>::=do <語句塊>while <條件> */</p><p> void xunhuan()</p><p>&l
56、t;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><
57、p> nnc=nextq; /* 記住if語句位置,emit之后nextq就變了 */</p><p> /* emit("0","if",num1,"goto"); */</p><p> scanner();</p><p> staBlock(&nChainTemp); /*
58、語句塊 */</p><p> if(syn==9) /* while */</p><p><b> {</b></p><p> scanner();</p><p> if(syn==26) /* ( */</p><p><b> {</b></p&g
59、t;<p> scanner();</p><p> strcpy(num1,E());</p><p> if((syn<=37)&&(syn>=32)) </p><p><b> {</b></p><p> switch(syn)</p><
60、p><b> {</b></p><p><b> case 32:</b></p><p> strcpy(op,">");</p><p><b> break;</b></p><p><b> case 33:<
61、/b></p><p> strcpy(op,">=");</p><p><b> break;</b></p><p><b> case 34:</b></p><p> strcpy(op,"<");</p>&
62、lt;p><b> break;</b></p><p><b> case 35:</b></p><p> strcpy(op,"<=");</p><p><b> break;</b></p><p><b> cas
63、e 36:</b></p><p> strcpy(op,"==");</p><p><b> break;</b></p><p><b> case 37:</b></p><p> strcpy(op,"!=");</p>
64、;<p><b> break;</b></p><p><b> default:</b></p><p> printf("error");</p><p><b> }</b></p><p><b> }</b
65、></p><p> scanner();</p><p> strcpy(num2,E());</p><p> strcat(num1,op);</p><p> strcat(num1,num2);</p><p> nnb=nextq;</p><p> emit(&q
66、uot;0","if",num1,"goto"); </p><p> backpatch(nnb,nnc);</p><p> nna=nextq;</p><p> emit("0","","","goto");</p&g
67、t;<p> backpatch(nna,nextq);</p><p><b> }</b></p><p> if(syn==27) /* ) */</p><p> scanner();</p><p><b> }</b></p><p>&
68、lt;b> }</b></p><p><b> }</b></p><p> void fuzhi() /* 賦值語句只有1個(gè)操作數(shù) */</p><p><b> {</b></p><p> char res[10],num[10]; /* num操作數(shù) */<
69、;/p><p> if(syn==10) /* 字符串 */</p><p><b> {</b></p><p> strcpy(res,token); /* 結(jié)果 */</p><p> scanner();</p><p> if(syn==21) /* = */</p>
70、<p><b> {</b></p><p> scanner();</p><p> strcpy(num,E());</p><p> emit(res,num,"=","");</p><p><b> }</b></p>
71、;<p><b> else</b></p><p><b> {</b></p><p> printf("缺少=號(hào)\n");</p><p><b> }</b></p><p><b> }</b><
72、/p><p><b> }</b></p><p> char* E() /* Expression表達(dá)式 */</p><p><b> {</b></p><p> char *res,*num1,*op,*num2;</p><p> res=(char *)ma
73、lloc(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><p> while
74、((syn==22)||(syn==23)) /* + - */</p><p><b> {</b></p><p> if(syn==22) /* + */</p><p> strcpy(op,"+");</p><p><b> else</b></p>
75、;<p> strcpy(op,"-");</p><p> scanner();</p><p> strcpy(num2,T());</p><p> strcpy(res,newTemp());</p><p> emit(res,num1,op,num2);</p><p
76、> strcpy(num1,res);</p><p><b> }</b></p><p> return num1;</p><p><b> }</b></p><p> char* T() /* Term項(xiàng) */</p><p><b>
77、{</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><p>
78、 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><p
79、> strcpy(op,"*");</p><p><b> else</b></p><p> strcpy(op,"/");</p><p> scanner();</p><p> strcpy(num2,F());</p><p>
80、 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> }
81、</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) /* 字符串
82、 */</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&
83、gt;<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) /* ( */&
84、lt;/p><p><b> {</b></p><p> scanner();</p><p><b> res=E();</b></p><p> if(syn==27) /* ) */</p><p><b> {</b></p>
85、<p> scanner();</p><p><b> }</b></p><p> else isError=1;</p><p><b> }</b></p><p><b> else</b></p><p> isEr
86、ror=1;</p><p> return res;</p><p><b> }</b></p><p> char *newTemp()</p><p><b> {</b></p><p><b> char *p;</b></p
87、><p> char 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>
88、;<p><b> p[0]='T';</b></p><p><b> return p;</b></p><p><b> }</b></p><p> /* 將p所鏈接的每個(gè)四元式的第四個(gè)分量都回填t */</p><p> voi
89、d backpatch(int p,int t) </p><p><b> {</b></p><p> int w,circle=p;</p><p> while(circle) /* circle不為0的時(shí)候 */</p><p><b> {</b></p><
90、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",t);</
91、p><p> circle=w; /* w記錄的是鏈條上下一個(gè)四元式,移動(dòng)! */</p><p><b> } return;</b></p><p><b> }</b></p><p> int merge(int p1,int p2) /* 合并p1和p2 */</p>&
92、lt;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><
93、p><b> {</b></p><p> nResult=circle=p2;</p><p> while(atoi(fourCom[circle].result)) /* 四元式第四個(gè)分量不為0 */</p><p><b> {</b></p><p> circle=ato
94、i(fourCom[circle].result); </p><p> /* strcpy(fourCom[circle].result,p1); */</p><p> sprintf(fourCom[circle].result,"%s",p1);</p><p> } /* 目的是用p1的值覆蓋0 */</p>&l
95、t;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,char *num2)</p>
96、<p><b> {</b></p><p> strcpy(fourCom[nextq].result,res);</p><p> strcpy(fourCom[nextq].arg1,num1);</p><p> strcpy(fourCom[nextq].opera,op);</p><p>
97、 strcpy(fourCom[nextq].arg2,num2);</p><p><b> nextq++;</b></p><p><b> }</b></p><p> void scanner() </p><p><b> { </b></p
98、><p><b> sum=0; </b></p><p> decimal=0; </p><p><b> m=0; </b></p><p> for(n=0;n<8;n++) </p><p> token[n]=NULL; </
99、p><p> ch=prog[p++]; /* 從prog中讀出一個(gè)字符到ch中 */</p><p> while(ch==' '||ch=='\n') /* 跳過空字符(無效輸入) */</p><p> ch=prog[p++]; </p><p> if(((ch>='
100、;a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))) /* ch是字母字符 */</p><p><b> { </b></p><p> while(((ch>='a')&&(ch
101、<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')&&(ch<='9'))) </p><p><b> { </b></p><p> token[m++]=ch; /* ch=
102、>token */</p><p> ch=prog[p++]; /* 讀下一個(gè)字符 */</p><p><b> } </b></p><p> token[m++]='\0'; </p><p> p--; /* 回退一格 */</p><
103、p> syn=10; /* 標(biāo)識(shí)符 */</p><p> /* 如果是"begin","if","then","while","do","end"標(biāo)識(shí)符中的一個(gè) */</p><p> for(n=0;n<9;n++) </p&g
104、t;<p> if(strcmp(token,rwtab[n])==0) </p><p><b> { </b></p><p> syn=n+1; </p><p><b> break; </b></p><p><b> } </b
105、></p><p><b> } </b></p><p> else if((ch>='0')&&(ch<='9')) </p><p><b> { </b></p><p><b> IsNum:&
106、lt;/b></p><p> if(isSignal==1)</p><p><b> {</b></p><p> /* token[m++]='-'; */</p><p><b> }</b></p><p> while((ch>
107、;='0')&&(ch<='9')) </p><p><b> { </b></p><p> sum=sum*10+ch-'0'; /* ch中數(shù)字本身是當(dāng)做字符存放的 */</p><p> ch=prog[p++]; </p>&
108、lt;p><b> } </b></p><p> if(ch=='.') </p><p><b> { </b></p><p> isDecimal=1; </p><p> ch=prog[p++]; </p><p&g
109、t; count=0; /* 之前忘了清零,123.123+123.123#兩個(gè)浮點(diǎn)數(shù)就無法識(shí)別 */</p><p> while((ch>='0')&&(ch<='9')) </p><p><b> { </b></p><p> /* pow(x,y)計(jì)算x的y
110、次冪 */</p><p> temp=(ch-'0')*pow(0.1,++count); </p><p> decimal=decimal+temp; </p><p> /* AddToDec(); */</p><p> ch=prog[p++]; </p><p&
111、gt;<b> } </b></p><p> sum=sum+decimal; </p><p><b> } </b></p><p> if(ch=='e'||ch=='E') </p><p><b> { </b
112、></p><p> isExp=1; </p><p> ch=prog[p++]; </p><p> if(ch=='-') </p><p><b> { </b></p><p> isNegative=1; </p>&
113、lt;p> ch=prog[p++]; </p><p><b> } </b></p><p> while((ch>='0')&&(ch<='9')) </p><p><b> { </b></p><p&g
114、t; /* 指數(shù) */</p><p> index=index*10+ch-'0'; </p><p> ch=prog[p++]; </p><p><b> } </b></p><p> /* 10的冪 */</p><p> /* 12
115、3e3代表123*10(3) */</p><p> /* sum=sum*pow(10,index);是錯(cuò)誤的 */</p><p> if(isNegative) </p><p> sum=sum*pow(0.1,index); </p><p><b> else </b></
116、p><p> sum=sum*pow(10,index); </p><p><b> } </b></p><p> if(isSignal==1)</p><p><b> {</b></p><p><b> sum=-sum;</b>
117、;</p><p> isSignal=0;</p><p><b> }</b></p><p><b> p--; </b></p><p> syn=20; </p><p><b> } </b></p>&l
118、t;p> else switch(ch) </p><p><b> { </b></p><p> case '<': </p><p><b> m=0; </b></p><p> token[m++]=ch; </p>
119、<p> ch=prog[p++]; </p><p> if(ch=='=') </p><p><b> { </b></p><p> syn=35; </p><p> token[m++]=ch; </p><p><b&g
120、t; } </b></p><p><b> else </b></p><p><b> { </b></p><p> syn=34; </p><p><b> p--; </b></p><p><b
121、> } </b></p><p><b> break; </b></p><p> case '>': </p><p><b> m=0; </b></p><p> token[m++]=ch; </p>&l
122、t;p> ch=prog[p++]; </p><p> if(ch=='=') </p><p><b> { </b></p><p> syn=33; </p><p> token[m++]=ch; </p><p><b>
123、 } </b></p><p><b> else </b></p><p><b> { </b></p><p> syn=32; </p><p><b> p--; </b></p><p><b>
124、; } </b></p><p><b> break; </b></p><p> case '=': </p><p><b> m=0; </b></p><p> token[m++]=ch; </p><p>
125、; ch=prog[p++]; </p><p> if(ch=='=') </p><p><b> { </b></p><p> syn=36; </p><p> token[m++]=ch; </p><p><b> } &
126、lt;/b></p><p><b> else </b></p><p><b> { </b></p><p> syn=21; </p><p><b> p--; </b></p><p><b> }
127、 </b></p><p><b> break; </b></p><p><b> case '+':</b></p><p> temp2=prog[p];</p><p> token[m++]=ch;</p><p> if
128、((temp2>='0')&&(temp2<='9')&&(repeat==1))</p><p><b> {</b></p><p> isSignal=2;</p><p> ch=prog[p++];</p><p><b&g
129、t; repeat=0;</b></p><p> goto IsNum;</p><p><b> }</b></p><p> if(((temp2=='+')||(temp2=='-'))&&(repeat==0)) /* 如果重復(fù)出現(xiàn)符號(hào),才將后邊的+,-視為正負(fù)號(hào)
130、*/</p><p><b> {</b></p><p><b> repeat=1;</b></p><p> /* ch=prog[p++]; */</p><p><b> }</b></p><p><b> syn=22;
131、</b></p><p><b> break;</b></p><p><b> case '-':</b></p><p> temp2=prog[p];</p><p> token[m++]=ch;</p><p> if((te
132、mp2>='0')&&(temp2<='9')&&(repeat==1))</p><p><b> {</b></p><p> isSignal=1;</p><p> ch=prog[p++]; /* 讀"-"下一個(gè)字符 */</p
133、><p><b> repeat=0;</b></p><p> goto IsNum; /* 轉(zhuǎn)到數(shù)字的識(shí)別 */</p><p><b> }</b></p><p> if(((temp2=='+')||(temp2=='-'))&&(re
134、peat==0)) /* 如果重復(fù)出現(xiàn)符號(hào),才將后邊的+,-視為正負(fù)號(hào) */</p><p><b> {</b></p><p> repeat=1; /* 預(yù)言會(huì)重復(fù) */</p><p> /* ch=prog[p++]; //讀下一個(gè)字符 */</p><p><b> }</b&g
135、t;</p><p><b> syn=23;</b></p><p><b> break; </b></p><p><b> case '*':</b></p><p> temp2=prog[p];</p><p> t
136、oken[m++]=ch;</p><p> if(temp2=='+')</p><p><b> {</b></p><p> isSignal=2;</p><p><b> repeat=1;</b></p><p><b> }&
137、lt;/b></p><p> else if(temp2=='-')</p><p><b> {</b></p><p> isSignal=1;</p><p><b> repeat=1;</b></p><p><b> }
138、</b></p><p><b> syn=24;</b></p><p><b> break;</b></p><p> case '/': </p><p> syn=25; </p><p> token[m++]=ch;
139、 </p><p> break; </p><p><b> case '(':</b></p><p> temp2=prog[p];</p><p> token[m++]=ch;</p><p> if(temp2=='+')</p
140、><p><b> {</b></p><p> isSignal=2;</p><p><b> repeat=1;</b></p><p><b> }</b></p><p> else if(temp2=='-')</
141、p><p><b> {</b></p><p> isSignal=1;</p><p><b> repeat=1;</b></p><p><b> }</b></p><p><b> syn=26;</b></
142、p><p><b> break;</b></p><p> case ')': </p><p> syn=27; </p><p> token[m++]=ch; </p><p><b> break; </b></p>
143、<p> case '{': </p><p> syn=28; </p><p> token[m++]=ch; </p><p><b> break; </b></p><p> case '}': </p><p>
144、; syn=29; </p><p> token[m++]=ch; </p><p><b> break; </b></p><p> case ',': </p><p> syn=30; </p><p> token[m++]=ch; &
145、lt;/p><p><b> break; </b></p><p> case ';': </p><p> syn=31; </p><p> token[m++]=ch; </p><p><b> break; </b></
146、p><p> case'#': </p><p><b> syn=0; </b></p><p> token[m++]=ch; </p><p><b> break; </b></p><p> default: </p&
147、gt;<p> syn=-1; </p><p><b> }</b></p><p><b> getch();</b></p><p><b> }</b></p><p><b> 八、總結(jié)</b></p>
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--一個(gè)簡單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--一個(gè)簡單文法的編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告(一個(gè)完整的編譯器)
- 編譯原理課程設(shè)計(jì)任務(wù)書--一個(gè)簡單的編譯器的設(shè)計(jì)與分析
- 編譯原理課程設(shè)計(jì)---簡單編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告-簡單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語言編譯器實(shí)現(xiàn)
- c語言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)____c語言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)---c語言編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---s語言的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程的設(shè)計(jì)--c語言編譯器
- 編譯原理課程設(shè)計(jì)-pl_0編譯器及其擴(kuò)充
- 編譯原理課程設(shè)計(jì)報(bào)告--pl0編譯器的擴(kuò)充
評論
0/150
提交評論