版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 編譯原理課程設(shè)計(jì)</b></p><p> 題 目 C語言編譯器實(shí)現(xiàn)</p><p> 計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)10 級(jí) 計(jì)本 班</p><p> 學(xué) 號(hào): </p><p> 姓 名: </p>
2、<p> 指導(dǎo)教師: </p><p> 完成時(shí)間: 2013 年 6 月 </p><p><b> 目 錄</b></p><p><b> 一、 原理1</b></p><p><b> 1、簡(jiǎn)介1</b>
3、</p><p> 2、單詞符號(hào)及種別表示1</p><p> 3、語法結(jié)構(gòu)定義如下:2</p><p><b> 二、運(yùn)行環(huán)境3</b></p><p> 三、 算法設(shè)計(jì)思想3</p><p> 1、詞法分析主要算法3</p><p> 2、語法分析
4、主要算法3</p><p> 3、語義分析主要算法4</p><p> 四、 程序流程圖5</p><p> 五、運(yùn)行測(cè)試結(jié)果8</p><p><b> 六、心得體會(huì)9</b></p><p><b> 七、源代碼9</b></p>&l
5、t;p><b> C語言編譯器實(shí)現(xiàn)</b></p><p><b> 一、 原理</b></p><p><b> 1、簡(jiǎn)介</b></p><p> 編譯程序的工作過程一般可以分為五個(gè)階段:詞法分析、語法分析、語義分析與中間代碼產(chǎn)生、優(yōu)化、目標(biāo)代碼生成。每一個(gè)階段在功能上是相對(duì)獨(dú)立的,
6、它一方面從上一個(gè)階段獲取分析的結(jié)果來進(jìn)行分析,另一方面由將結(jié)果傳遞給下一個(gè)階段。由編譯程序的五個(gè)階段就對(duì)應(yīng)了編譯系統(tǒng)的結(jié)構(gòu)。</p><p> 2、單詞符號(hào)及種別表示</p><p> 3、語法結(jié)構(gòu)定義如下:</p><p> <程序> ::= main()<語句塊> </p><p> <語句塊>
7、 ::= ‘{‘<語句串>’}’ </p><p> <語句串>::=<語句>{;<語句>};</p><p> <語句>::=<賦值語句>|<條件語句>|<循環(huán)語句></p><p> <賦值語句>::=ID=<表達(dá)式> </p&g
8、t;<p> <條件語句>::=if<條件><語句塊> </p><p> <循環(huán)語句>::=do <語句塊>while <條件></p><p> <條件>::=<表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式> </p><p>
9、<表達(dá)式> ::= <項(xiàng)>{ +<項(xiàng)>|-<項(xiàng)>}</p><p> <項(xiàng)> ::= <因子>{*<因子>|/<因子>}</p><p> <因子> ::=ID|num|(<表達(dá)式>)</p><p> <關(guān)系運(yùn)算符> ::= &
10、lt;|<=|>|>=|==|!</p><p><b> 二、運(yùn)行環(huán)境</b></p><p> Windows 系統(tǒng) Visual C++ 6.0</p><p><b> 三、 算法設(shè)計(jì)思想</b></p><p> 1、詞法分析主要算法</p><
11、;p> 這部分對(duì)源文件進(jìn)行分析,允許/* */注釋。從源文件依次讀取字符,對(duì)字符進(jìn)行分析,組成字符串、數(shù)字、關(guān)系符等固定含義的token符,并把它們添加到token鏈中,如果遇到非法字符報(bào)錯(cuò)并退出程序。</p><p> 2、語法分析主要算法</p><p> 這部分對(duì)Token鏈進(jìn)行分析,利用自底向上的分析方法,構(gòu)建SLR(1)分析表的過程是手工完成的。語法分析的同時(shí)構(gòu)
12、建語法樹,移進(jìn)時(shí)創(chuàng)建葉子,規(guī)約時(shí)創(chuàng)建節(jié)點(diǎn)。</p><p> 3、語義分析主要算法</p><p> 這部分對(duì)語法樹從左到右進(jìn)行遍歷,節(jié)點(diǎn)記錄了規(guī)約式的編號(hào),遍歷到節(jié)點(diǎn)時(shí)就進(jìn)行相應(yīng)處理。語義分析主要檢查變量、函數(shù)是否被定義或重定義,同時(shí)產(chǎn)生四元式。</p><p><b> 函數(shù)一覽表</b></p><p>
13、void scanner(); </p><p> void lrparser(); </p><p> void staBlock(int *nChain); </p><p> void staString(int *nChain);</p><p> void sta(int *nChain); </p><
14、p> void fuzhi(); </p><p> void tiaojian(int *nChain); </p><p> void xunhuan(); </p><p> char* E(); </p><p> char* T(); </p><p> char* F(); </p&
15、gt;<p> char *newTemp(); </p><p> void backpatch(int p,int t); </p><p> int merge(int p1,int p2); </p><p> void emit(char *res,char *num1,char *op,char *num2);</p>
16、<p><b> 四元組結(jié)構(gòu)體定義:</b></p><p><b> struct{</b></p><p> char result[10]; </p><p> char arg1[10];</p><p> char opera[10];</p><
17、p> char arg2[10];</p><p> }fourCom[20];</p><p><b> 四、 程序流程圖</b></p><p><b> 圖1 主函數(shù)流程圖</b></p><p><b> 否</b></p><p&g
18、t;<b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p> 圖
19、2 遞歸下降分析分析程序流程圖 </p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p> 圖3 語句塊分析流程圖</p><p><b> 否</b&g
20、t;</p><p><b> 是</b></p><p> 圖4 語句串分析流程圖</p><p><b> 是否</b></p><p><b> 否</b></p><p><b> 是</b></p>
21、<p><b> 否</b></p><p><b> 是</b></p><p> 圖5 語句分析流程圖</p><p><b> 五、運(yùn)行測(cè)試結(jié)果</b></p><p><b> 正確程序結(jié)果</b></p>&
22、lt;p> 錯(cuò)誤程序結(jié)果:報(bào)錯(cuò)?。?)</p><p> 錯(cuò)誤程序結(jié)果:報(bào)錯(cuò)!(2)</p><p><b> 六、心得體會(huì)</b></p><p> 這次的課程設(shè)計(jì),最大的收獲就是清楚了編譯的整個(gè)過程,在學(xué)習(xí)編譯原理這門課程之時(shí),在做設(shè)計(jì)的過程中和詞法分析、語法分析、語義分析聯(lián)系起來, 非常清晰的理解了簡(jiǎn)單編譯器實(shí)現(xiàn)過程。讀完了
23、一個(gè)完整的源程序,知道了它里面的功能??煲约敖Y(jié)構(gòu)組織,也明白了編譯的基本原理.。在實(shí)驗(yàn)中加深了在課堂上說學(xué)到編譯原理知識(shí)的理解,實(shí)驗(yàn)中實(shí)踐了書本上的知識(shí)和原理。</p><p> 通過這次課程設(shè)計(jì)也使我認(rèn)識(shí)到自己的不足。首先這些代碼我并不能獨(dú)立完成,而是在網(wǎng)上查閱了大量資料,以及在許多同學(xué)的幫助下才完成的。其次平時(shí)對(duì)編譯原理的各個(gè)部分理解的不錯(cuò),平時(shí)實(shí)驗(yàn)做的也還可以,只是在做這次的課程設(shè)計(jì)的時(shí)候需要把整個(gè)編譯的
24、過程整體的思路搞清楚。通過看以前的筆記和課本,我了解了各個(gè)階段間的連接,最終使得本次課程設(shè)計(jì)的順利完成。</p><p><b> 七、源代碼</b></p><p> #include<stdio.h></p><p> #include<string.h></p><p> #incl
25、ude<math.h></p><p> #include<stdlib.h></p><p> char prog[80]; </p><p> char token[8]; </p><p> char ch; </p><p> int syn,p,m,n,i;
26、 </p><p> double sum; </p><p> int count; </p><p> int isSignal; </p><p> int isError;</p><p> int isDecimal; </p><p> do
27、uble decimal; </p><p> int isExp; </p><p> int index; </p><p> int isNegative; </p><p> double temp; </p><p> int temp2;</p><p&g
28、t; int repeat; </p><p> int nextq;</p><p><b> int kk; </b></p><p> int ntc,nfc,nnc,nnb,nna;</p><p> char *rwtab[9]={"main","int",&q
29、uot;float","double","char","if","else","do","while"};</p><p><b> struct{</b></p><p> char result[10]; </p>&
30、lt;p> char arg1[10];</p><p> char opera[10];</p><p> char arg2[10];</p><p> }fourCom[20]; </p><p> void scanner(); </p><p> void lrparser(); </
31、p><p> void staBlock(int *nChain); </p><p> void staString(int *nChain);</p><p> void sta(int *nChain); </p><p> void fuzhi(); </p><p> void tiaojian(int
32、 *nChain); </p><p> void xunhuan(); </p><p> char* E(); </p><p> char* T(); </p><p> char* F(); </p><p> char *newTemp(); </p><p> void
33、backpatch(int p,int t); </p><p> int merge(int p1,int p2); </p><p> void emit(char *res,char *num1,char *op,char *num2); </p><p> void main()</p><p><b> {<
34、/b></p><p><b> p=0;</b></p><p><b> count=0;</b></p><p> isDecimal=0;</p><p><b> index=0;</b></p><p><b> r
35、epeat=0;</b></p><p><b> kk=0;</b></p><p> printf("\n請(qǐng)輸入待編譯程序:\n");</p><p><b> do{</b></p><p> ch=getchar();</p><p
36、> prog[p++]=ch;</p><p> }while(ch!='#');</p><p><b> p=0;</b></p><p> isError=0;</p><p> scanner();</p><p> lrparser();</p&g
37、t;<p> for(i=1;i<nextq;i++) </p><p><b> {</b></p><p> printf("\n%d\t",i);</p><p> printf("(%5s %5s %5s \t%5s )\n",fourCom[i].arg1,fou
38、rCom[i].opera,fourCom[i].arg2,fourCom[i].result);</p><p><b> }</b></p><p><b> }</b></p><p> void lrparser()</p><p><b> {</b><
39、/p><p> int nChain;</p><p> nfc=ntc=1;</p><p><b> nextq=1;</b></p><p> if(syn==1) </p><p><b> {</b></p><p> scanner
40、();</p><p> if(syn==26) </p><p><b> {</b></p><p> scanner();</p><p> if(syn==27)</p><p><b> {</b></p><p> scanne
41、r();</p><p> staBlock(&nChain);</p><p><b> }</b></p><p><b> else</b></p><p> printf("缺少右括號(hào)\n");</p><p><b>
42、 }</b></p><p><b> else </b></p><p> printf("缺少左括號(hào)\n");</p><p><b> }</b></p><p><b> else</b></p><p>
43、 printf("缺少main\n");</p><p><b> }</b></p><p> void staBlock(int *nChain) </p><p><b> {</b></p><p> if(syn==28) </p><p&
44、gt;<b> {</b></p><p> scanner();</p><p> staString(nChain);</p><p> if(syn==29) </p><p> scanner(); </p><p><b> else</b></
45、p><p> printf("缺少}號(hào)\n");</p><p><b> }</b></p><p><b> else</b></p><p> printf("缺少{號(hào)\n");</p><p><b> }<
46、;/b></p><p> void staString(int *nChain) </p><p><b> {</b></p><p> sta(nChain);</p><p> backpatch(*nChain,nextq);</p><p> while(syn==31
47、) </p><p><b> {</b></p><p> scanner();</p><p> sta(nChain);</p><p><b> }</b></p><p><b> }</b></p><p>
48、 void sta(int *nChain) </p><p><b> {</b></p><p> if(syn==10)</p><p><b> {</b></p><p><b> fuzhi();</b></p><p><b
49、> }</b></p><p> else if(syn==6) </p><p><b> {</b></p><p> tiaojian(nChain);</p><p><b> }</b></p><p> else if(syn==8)
50、 </p><p> xunhuan();</p><p><b> }</b></p><p> void tiaojian(int *nChain)</p><p><b> {</b></p><p> char res[10],num1[10],num2[1
51、0],op[10];</p><p> int nChainTemp;</p><p> if(syn==6) </p><p><b> {</b></p><p> scanner();</p><p> if(syn==26) </p><p><b&
52、gt; {</b></p><p> scanner();</p><p> strcpy(num1,E());</p><p> if((syn<=37)&&(syn>=32)) </p><p><b> {</b></p><p> swi
53、tch(syn)</p><p><b> {</b></p><p><b> case 32:</b></p><p> strcpy(op,">");</p><p><b> break;</b></p><p>
54、;<b> case 33:</b></p><p> strcpy(op,">=");</p><p><b> break;</b></p><p><b> case 34:</b></p><p> strcpy(op,"&
55、lt;");</p><p><b> break;</b></p><p><b> case 35:</b></p><p> strcpy(op,"<=");</p><p><b> break;</b></p>
56、<p><b> case 36:</b></p><p> strcpy(op,"==");</p><p><b> break;</b></p><p><b> case 37:</b></p><p> strcpy(op,&
57、quot;!=");</p><p><b> break;</b></p><p><b> default:</b></p><p> printf("error");</p><p><b> }</b></p><
58、;p><b> }</b></p><p> scanner();</p><p> strcpy(num2,E());</p><p> strcat(num1,op);</p><p> strcat(num1,num2);</p><p> ntc=nextq; </
59、p><p> emit("0","if",num1,"goto"); </p><p> nfc=nextq; </p><p> emit("0","","","goto");</p><p> b
60、ackpatch(ntc,nextq); </p><p><b> }</b></p><p> if(syn==27) </p><p> scanner();</p><p> staBlock(&nChainTemp); </p><p> *nChain=merge
61、(nChainTemp,nfc);</p><p><b> }</b></p><p><b> }</b></p><p> void xunhuan()</p><p><b> {</b></p><p> char res[10],n
62、um1[10],num2[10],op[10];</p><p> int nChainTemp;</p><p> if(syn==8) </p><p><b> {</b></p><p> nnc=nextq; </p><p> scanner();</p>&l
63、t;p> staBlock(&nChainTemp); </p><p> if(syn==9) </p><p><b> {</b></p><p> scanner();</p><p> if(syn==26) </p><p><b> {</b
64、></p><p> scanner();</p><p> strcpy(num1,E());</p><p> if((syn<=37)&&(syn>=32)) </p><p><b> {</b></p><p> switch(syn)<
65、/p><p><b> {</b></p><p><b> case 32:</b></p><p> strcpy(op,">");</p><p><b> break;</b></p><p><b>
66、case 33:</b></p><p> strcpy(op,">=");</p><p><b> break;</b></p><p><b> case 34:</b></p><p> strcpy(op,"<");&
67、lt;/p><p><b> break;</b></p><p><b> case 35:</b></p><p> strcpy(op,"<=");</p><p><b> break;</b></p><p>&l
68、t;b> case 36:</b></p><p> strcpy(op,"==");</p><p><b> break;</b></p><p><b> case 37:</b></p><p> strcpy(op,"!="
69、;);</p><p><b> break;</b></p><p><b> default:</b></p><p> printf("error");</p><p><b> }</b></p><p><b&
70、gt; }</b></p><p> scanner();</p><p> strcpy(num2,E());</p><p> strcat(num1,op);</p><p> strcat(num1,num2);</p><p> nnb=nextq;</p><p&
71、gt; emit("0","if",num1,"goto"); </p><p> backpatch(nnb,nnc);</p><p> nna=nextq;</p><p> emit("0","","","goto&quo
72、t;);</p><p> backpatch(nna,nextq);</p><p><b> }</b></p><p> if(syn==27) </p><p> scanner();</p><p><b> }</b></p><p
73、><b> }</b></p><p><b> }</b></p><p> void fuzhi() </p><p><b> {</b></p><p> char res[10],num[10]; </p><p> if(s
74、yn==10) </p><p><b> {</b></p><p> strcpy(res,token);</p><p> scanner();</p><p> if(syn==21) </p><p><b> {</b></p><p
75、> scanner();</p><p> strcpy(num,E());</p><p> emit(res,num,"=","");</p><p><b> }</b></p><p><b> else</b></p>
76、<p><b> {</b></p><p> printf("缺少=號(hào)\n");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
77、<p><b> char* E()</b></p><p><b> {</b></p><p> char *res,*num1,*op,*num2;</p><p> res=(char *)malloc(10);</p><p> num1=(char *)mallo
78、c(10);</p><p> op=(char *)malloc(10);</p><p> num2=(char *)malloc(10);</p><p> strcpy(num1,T());</p><p> while((syn==22)||(syn==23)) </p><p><b>
79、 {</b></p><p> if(syn==22)</p><p> strcpy(op,"+");</p><p><b> else</b></p><p> strcpy(op,"-");</p><p> scanner(
80、);</p><p> strcpy(num2,T());</p><p> strcpy(res,newTemp());</p><p> emit(res,num1,op,num2);</p><p> strcpy(num1,res);</p><p><b> }</b><
81、/p><p> return num1;</p><p><b> }</b></p><p> char* T() </p><p><b> {</b></p><p> char *res,*num1,*op,*num2;</p><p>
82、 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,F());</p><
83、p> while((syn==24)||(syn==25)) //* /</p><p><b> {</b></p><p> if(syn==24) </p><p> strcpy(op,"*");</p><p><b> else</b></p&g
84、t;<p> strcpy(op,"/");</p><p> scanner();</p><p> strcpy(num2,F());</p><p> strcpy(res,newTemp());</p><p> emit(res,num1,op,num2);</p><
85、p> strcpy(num1,res);</p><p><b> }</b></p><p> return num1;</p><p><b> }</b></p><p> char* F() </p><p><b> {</b>
86、;</p><p> char *res;</p><p> res=(char *)malloc(10);</p><p> if(syn==10)</p><p><b> {</b></p><p> strcpy(res,token);</p><p>
87、 scanner();</p><p><b> }</b></p><p> else if(syn==20) </p><p><b> {</b></p><p> itoa((int)sum,res,10);</p><p> scanner();</
88、p><p><b> }</b></p><p> else if(syn==26) </p><p><b> {</b></p><p> scanner();</p><p><b> res=E();</b></p><
89、p> if(syn==27) </p><p><b> {</b></p><p> scanner();</p><p><b> }</b></p><p> else isError=1;</p><p><b> }</b>&
90、lt;/p><p><b> else</b></p><p> isError=1;</p><p> return res;</p><p><b> }</b></p><p> char *newTemp()</p><p><b&
91、gt; {</b></p><p><b> char *p;</b></p><p> char varTemp[10];</p><p> p=(char *)malloc(10);</p><p><b> kk++;</b></p><p>
92、itoa(kk,varTemp,10);</p><p> strcpy(p+1,varTemp);</p><p><b> p[0]='T';</b></p><p><b> return p;</b></p><p><b> }</b><
93、/p><p> void backpatch(int p,int t) </p><p><b> {</b></p><p> int w,circle=p;</p><p> while(circle)</p><p><b> {</b></p>&
94、lt;p> w=atoi(fourCom[circle].result); </p><p> sprintf(fourCom[circle].result,"%d",t);</p><p> circle=w; </p><p><b> }</b></p><p><b>
95、 return;</b></p><p><b> }</b></p><p> int merge(int p1,int p2) </p><p><b> {</b></p><p> char circle,nResult;</p><p><
96、;b> if(p2==0)</b></p><p> nResult=p1;</p><p><b> else</b></p><p><b> {</b></p><p> nResult=circle=p2;</p><p> while(
97、atoi(fourCom[circle].result))</p><p><b> {</b></p><p> circle=atoi(fourCom[circle].result); </p><p> sprintf(fourCom[circle].result,"%s",p1);</p><
98、;p><b> }</b></p><p><b> }</b></p><p> return nResult; </p><p><b> }</b></p><p> void emit(char *res,char *num1,char *op,char
99、 *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);&l
100、t;/p><p> strcpy(fourCom[nextq].arg2,num2);</p><p><b> nextq++;</b></p><p><b> }</b></p><p> void scanner() </p><p><b> {
101、 </b></p><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> tok
102、en[n]=NULL; </p><p> ch=prog[p++]; </p><p> while(ch==' '||ch=='\n') </p><p> ch=prog[p++]; </p><p> if(((ch>='a')&&(c
103、h<='z'))||((ch>='A')&&(ch<='Z'))) </p><p><b> { </b></p><p> while(((ch>='a')&&(ch<='z'))||((ch>='
104、;A')&&(ch<='Z'))||((ch>='0')&&(ch<='9'))) </p><p><b> { </b></p><p> token[m++]=ch; </p><p> ch=prog[p++];
105、 </p><p><b> } </b></p><p> token[m++]='\0'; </p><p><b> p--; </b></p><p><b> syn=10; </b></p><p>
106、 for(n=0;n<9;n++) </p><p> if(strcmp(token,rwtab[n])==0) </p><p><b> { </b></p><p> syn=n+1; </p><p><b> break; </b></p>
107、<p><b> } </b></p><p><b> }</b></p><p> else if((ch>='0')&&(ch<='9')) </p><p><b> {</b></p>&
108、lt;p><b> IsNum:</b></p><p> if(isSignal==1)</p><p><b> {}</b></p><p> while((ch>='0')&&(ch<='9')) </p><p>
109、;<b> { </b></p><p> sum=sum*10+ch-'0'; </p><p> ch=prog[p++]; </p><p><b> } </b></p><p> if(ch=='.') </p>
110、<p><b> { </b></p><p> isDecimal=1; </p><p> ch=prog[p++]; </p><p><b> count=0; </b></p><p> while((ch>='0')&&
111、;(ch<='9')) </p><p><b> {</b></p><p> temp=(ch-'0')*pow(0.1,++count); </p><p> decimal=decimal+temp;</p><p> ch=prog[p++]; <
112、/p><p><b> } </b></p><p> sum=sum+decimal; </p><p><b> } </b></p><p> if(ch=='e'||ch=='E') </p><p><b&g
113、t; { </b></p><p> isExp=1; </p><p> ch=prog[p++]; </p><p> if(ch=='-') </p><p><b> { </b></p><p> isNegative=1;
114、 </p><p> ch=prog[p++]; </p><p><b> } </b></p><p> while((ch>='0')&&(ch<='9')) </p><p><b> { </b></
115、p><p> index=index*10+ch-'0'; </p><p> ch=prog[p++]; </p><p><b> } </b></p><p> if(isNegative) </p><p> sum=sum*pow(0.1,index
116、); </p><p><b> else </b></p><p> sum=sum*pow(10,index); </p><p><b> } </b></p><p> if(isSignal==1)</p><p><b> {&l
117、t;/b></p><p><b> sum=-sum;</b></p><p> isSignal=0;</p><p><b> }</b></p><p><b> p--; </b></p><p> syn=20; &l
118、t;/p><p><b> } </b></p><p> else switch(ch) </p><p><b> { </b></p><p> case '<': </p><p><b> m=0; <
119、/b></p><p> token[m++]=ch; </p><p> ch=prog[p++]; </p><p> if(ch=='=') </p><p><b> { </b></p><p> syn=35; </p>
120、<p> token[m++]=ch; </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> syn=34; </p><p
121、><b> p--; </b></p><p><b> } </b></p><p><b> break; </b></p><p> case '>': </p><p><b> m=0; </b
122、></p><p> token[m++]=ch; </p><p> ch=prog[p++]; </p><p> if(ch=='=') </p><p><b> { </b></p><p> syn=33; </p>&
123、lt;p> token[m++]=ch; </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> syn=32; </p><p>
124、;<b> p--; </b></p><p><b> } </b></p><p><b> break; </b></p><p> case '=': </p><p><b> m=0; </b>&l
125、t;/p><p> token[m++]=ch; </p><p> ch=prog[p++]; </p><p> if(ch=='=') </p><p><b> { </b></p><p> syn=36; </p><p&g
126、t; token[m++]=ch; </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> syn=21; </p><p><b
127、> p--; </b></p><p><b> } </b></p><p><b> break; </b></p><p><b> case '+':</b></p><p> temp2=prog[p];<
128、/p><p> token[m++]=ch;</p><p> if((temp2>='0')&&(temp2<='9')&&(repeat==1))</p><p><b> {</b></p><p> isSignal=2;</p
129、><p> ch=prog[p++];</p><p><b> repeat=0;</b></p><p> goto IsNum;</p><p><b> }</b></p><p> if(((temp2=='+')||(temp2=='
130、-'))&&(repeat==0)) </p><p><b> {</b></p><p><b> repeat=1;</b></p><p> }syn=22;</p><p><b> break;</b></p>
131、<p><b> case '-':</b></p><p> temp2=prog[p];</p><p> token[m++]=ch;</p><p> if((temp2>='0')&&(temp2<='9')&&(repeat
132、==1))</p><p><b> {</b></p><p> isSignal=1;</p><p> ch=prog[p++]; </p><p><b> repeat=0;</b></p><p> goto IsNum; </p>&l
133、t;p><b> }</b></p><p> if(((temp2=='+')||(temp2=='-'))&&(repeat==0)) </p><p><b> {</b></p><p> repeat=1; </p><p>
134、<b> }</b></p><p><b> syn=23;</b></p><p><b> break; </b></p><p><b> case '*':</b></p><p> temp2=prog[p];<
135、/p><p> token[m++]=ch;</p><p> if(temp2=='+')</p><p><b> {</b></p><p> isSignal=2;</p><p><b> repeat=1;</b></p>&l
136、t;p><b> }</b></p><p> else if(temp2=='-')</p><p><b> {</b></p><p> isSignal=1;</p><p><b> repeat=1;</b></p>&
137、lt;p><b> }</b></p><p><b> syn=24;</b></p><p><b> break;</b></p><p> case '/': </p><p> syn=25; </p><p
138、> token[m++]=ch; </p><p> break; </p><p><b> case '(':</b></p><p> temp2=prog[p];</p><p> token[m++]=ch;</p><p> if(temp2
139、=='+')</p><p><b> {</b></p><p> isSignal=2;</p><p><b> repeat=1;</b></p><p><b> }</b></p><p> else if(temp
140、2=='-')</p><p><b> {</b></p><p> isSignal=1;</p><p><b> repeat=1;</b></p><p><b> }</b></p><p><b> sy
141、n=26;</b></p><p><b> break;</b></p><p> case ')': </p><p> syn=27; </p><p> token[m++]=ch; </p><p><b> break;
142、</b></p><p> case '{': </p><p> syn=28; </p><p> token[m++]=ch; </p><p><b> break; </b></p><p> case '}':
143、</p><p> syn=29; </p><p> token[m++]=ch; </p><p><b> break; </b></p><p> case ',': </p><p> syn=30; </p><p>
144、 token[m++]=ch; </p><p><b> break; </b></p><p> case ';': </p><p> syn=31; </p><p> token[m++]=ch; </p><p><b> bre
145、ak; </b></p><p> case'#': </p><p><b> syn=0; </b></p><p> token[m++]=ch; </p><p><b> break; </b></p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(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ì)--c語言編譯器
- 編譯原理課程設(shè)計(jì)___c語言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程設(shè)計(jì)---s語言的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---簡(jiǎn)單編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- c語言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語言編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語法分析的實(shí)現(xiàn)
- 小型c語言編譯器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告-簡(jiǎn)單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)-pl_0編譯器及其擴(kuò)充
- 編譯原理課程設(shè)計(jì)報(bào)告(一個(gè)完整的編譯器)
評(píng)論
0/150
提交評(píng)論