版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 編譯技術(shù)課程設(shè)計(jì)</b></p><p> 班 級 </p><p> 學(xué) 號 </p><p> 姓 名 </p><p> 指導(dǎo)老師 </p><
2、;p><b> 年 月</b></p><p><b> 目 錄</b></p><p> 一、目的------------------------------------------------------------------------------------------2</p><p> 二
3、、任務(wù)及要求---------------------------------------------------------------------------------2</p><p> 三、實(shí)驗(yàn)環(huán)境------------------------------------------------------------------------------------4</p><p
4、> 四、實(shí)現(xiàn)過程說明------------------------------------------------------------------------------4</p><p> 1.詞法分析器------------------------------------------------------------------------------4</p><
5、p> ?。?)單詞符號表------------------------------------------------------------------------4</p><p> (2)數(shù)據(jù)結(jié)構(gòu)---------------------------------------------------------------------------5</p><p> ?。?/p>
6、3)函數(shù)說明---------------------------------------------------------------------------5</p><p> ?。?)流程圖------------------------------------------------------------------------------6</p><p> 2.語法分
7、析器------------------------------------------------------------------------------6</p><p> ?。?)分析方法說明---------------------------------------------------------------------6</p><p> ?。?)文法--------
8、-------------------------------------------------------------------------6</p><p> (3)數(shù)據(jù)結(jié)構(gòu)---------------------------------------------------------------------------7</p><p> ?。?)函數(shù)說明--------
9、-------------------------------------------------------------------7</p><p> 3.中間代碼生成器------------------------------------------------------------------------10</p><p> ?。?)屬性文法--------------
10、------------------------------------------------------------10</p><p> ?。?)數(shù)據(jù)結(jié)構(gòu)--------------------------------------------------------------------------11</p><p> (3)函數(shù)說明--------------------
11、------------------------------------------------------11</p><p> (4)流程圖------------------------------------------------------------------------------11</p><p> 五、程序運(yùn)行結(jié)果----------------------
12、--------------------------------------------------------12</p><p> 六、總結(jié)------------------------------------------------------------------------------------------16</p><p><b> 一、目的</
13、b></p><p> <<編譯技術(shù)>>是理論與實(shí)踐并重的課程,而其課程設(shè)計(jì)要綜合運(yùn)用一、二年級所學(xué)的多門課程的內(nèi)容,用來完成一個(gè)小型編譯程序。從而鞏固和加強(qiáng)對詞法分析、語法分析、語義分析、代碼生成和報(bào)錯(cuò)處理等理論的認(rèn)識(shí)和理解;培養(yǎng)學(xué)生對完整系統(tǒng)的獨(dú)立分析和設(shè)計(jì)的能力,進(jìn)一步培養(yǎng)學(xué)生的獨(dú)立編程能力。</p><p><b> 二、任務(wù)及要求<
14、;/b></p><p><b> 基本要求:</b></p><p> 詞法分析器 產(chǎn)生下述小語言的單詞序列</p><p> 這個(gè)小語言的所有的單詞符號,以及它們的種別編碼和內(nèi)碼值如下表:</p><p> 對于這個(gè)小語言,有幾點(diǎn)重要的限制:</p><p> 首先,所有的關(guān)
15、鍵字(如if﹑while等)都是“保留字”。所謂的保留字的意思是,用戶不得使用它們作為自己定義的標(biāo)示符。例如,下面的寫法是絕對禁止的:</p><p> if(5)=x </p><p> 其次,由于把關(guān)鍵字作為保留字,故可以把關(guān)鍵字作為一類特殊標(biāo)示符來處理。也就是說,對于關(guān)鍵字不專設(shè)對應(yīng)的轉(zhuǎn)換圖。但把它們(及其種別編碼)預(yù)先安排在一張表格中(
16、此表叫作保留字表)。當(dāng)轉(zhuǎn)換圖識(shí)別出一個(gè)標(biāo)識(shí)符時(shí),就去查對這張表,確定它是否為一個(gè)關(guān)鍵字。</p><p> 再次,如果關(guān)鍵字、標(biāo)識(shí)符和常數(shù)之間沒有確定的運(yùn)算符或界符作間隔,則必須至少用一個(gè)空白符作間隔(此時(shí),空白符不再是完全沒有意義的了)。例如,一個(gè)條件語句應(yīng)寫為</p><p> if i>0 i= 1;</p><p><b> 而絕對
17、不要寫成</b></p><p> ifi>0 i=1;</p><p> 因?yàn)閷τ诤笳?,我們的分析器將無條件地將ifi看成一個(gè)標(biāo)識(shí)符。</p><p> 這個(gè)小語言的單詞符號的狀態(tài)轉(zhuǎn)換圖,如下圖:</p><p> 語法分析器 能識(shí)別由加+ 乘* 乘方** 括號()操作數(shù)所組成的算術(shù)表達(dá)式,其文法如下:</
18、p><p><b> E→E+T|T</b></p><p><b> T→T*F|F</b></p><p><b> F→P**F|P</b></p><p><b> P→(E)|i</b></p><p> 使用的算法
19、可以是:預(yù)測分析法;遞歸下降分析法;LR分析法等。</p><p> 中間代碼生成器 產(chǎn)生上述算術(shù)表達(dá)式的中間代碼(四元式序列)</p><p><b> 較高要求:</b></p><p> 擴(kuò)充上述小語言的單詞;</p><p> 增加語法分析器的功能,能識(shí)別條件語句和循環(huán)語句等;</p>&
20、lt;p> 增加中間代碼生成器的功能,能產(chǎn)生條件語句和循環(huán)語句等的中間代碼(四元式序列)</p><p> 報(bào)錯(cuò)基礎(chǔ)上增加錯(cuò)誤信息;</p><p> 將中間代碼翻譯成匯編語言。</p><p><b> 三、實(shí)驗(yàn)環(huán)境</b></p><p> 開發(fā)環(huán)境VC++;Visual Studio;Java開發(fā)環(huán)
21、境</p><p> 語言C;C++;C#;Java</p><p> 說明:課程設(shè)計(jì)可以使用任何一種語言工具,課程設(shè)計(jì)報(bào)告中請按照自己實(shí)際采用的開發(fā)工具及技術(shù)來寫。</p><p><b> 四、實(shí)現(xiàn)過程說明</b></p><p><b> 1.詞法分析器</b></p>
22、<p><b> ?。?)單詞符號表</b></p><p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p> 用words[10]存放構(gòu)成單詞符號的字符串,并且用于判斷是否為關(guān)鍵字。flags[500] 存放單詞符號的種別碼。Number存放整數(shù)值,words[]存放標(biāo)識(shí)符,關(guān)鍵字或者其他符號。cnt[num]按順序存放讀到的字符,為
23、下面語義分析做準(zhǔn)備。Status用于判斷是否為關(guān)鍵字,1是,0不是。</p><p><b> 函數(shù)說明</b></p><p> 在Scan ()子函數(shù)中,先全部初始化,然后讀一個(gè)字符,分析它是什么類型:如果是字母類型,則接著往下讀,直到讀到非字母的字符,存入words[10]中,依次對比關(guān)鍵字表中的元素,如果相同,則將flags[]置為相應(yīng)的種別碼,如果全都掃
24、描后沒發(fā)現(xiàn)相同的關(guān)鍵字,則為普通的標(biāo)識(shí)符,返回主函數(shù)輸出。</p><p> 如果是數(shù)字類型,首先分析第一個(gè)符號,接著讀下一個(gè)字符串,直到讀到一個(gè)不是數(shù)字的字符串位置,每讀一個(gè)數(shù)字字符,就將他們轉(zhuǎn)化為相應(yīng)的數(shù)字,使用輾轉(zhuǎn)相乘法,每次都讓number先自乘10,然后加上這個(gè)數(shù)字,這樣就將字符串表示的數(shù)字轉(zhuǎn)化成了相應(yīng)的數(shù),返回主函數(shù)輸出。</p><p> 如果是其他單詞表的符號,則將他們
25、的flags[]置為相應(yīng)的種別碼,并將字符存到words[] 中返回主函數(shù)輸出。</p><p><b> 流程圖</b></p><p><b> 2.語法分析器</b></p><p> ?。?)分析方法說明 </p><p><b> 采用遞歸下降分析法</b>&
26、lt;/p><p><b> 文法</b></p><p> E→E+T|E-T|T</p><p> T→T*F|E/F|F</p><p><b> F→P**F|P</b></p><p><b> P→(E)|i</b></p>
27、<p><b> 改造后的文法</b></p><p> E→TE’|TE’’</p><p><b> E’→+TE’|ε</b></p><p> E’’→-TE’’|ε</p><p> T→FT’|FT’’</p><p><b>
28、 T’→*FT’|ε</b></p><p> T’’→/FT’’|ε</p><p><b> F→PF’</b></p><p><b> F’→**F|ε</b></p><p><b> P→(E)|i</b></p><p>
29、; (3)數(shù)據(jù)結(jié)構(gòu)與函數(shù)說明</p><p> 在main函數(shù)調(diào)用E()函數(shù),如果調(diào)用之后返回時(shí),如果((flags[temp]==0)&&is_right)為真,就輸出“分析成功”,否則輸出“分析失敗”。其中is_right為設(shè)定的標(biāo)志,初值為1,如果在調(diào)用子函數(shù)的過程中如果有錯(cuò)誤,則置is_right為0。</p><p> E函數(shù): 調(diào)用T函數(shù),調(diào)用F函數(shù),
30、 調(diào)用P函數(shù),返回后看是否是’+’或’-’,如果是,則調(diào)用 E1函數(shù),再調(diào)用E2函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p> E1函數(shù):判斷是不是”+”或者“-” 如果是,調(diào)用F函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p><b> 代碼:</b></p><p><b>
31、 void E()</b></p><p><b> {</b></p><p> cout<<"E->TE''"<<endl;</p><p><b> T();</b></p><p><b> E
32、2();</b></p><p><b> }</b></p><p><b> void E1()</b></p><p><b> {</b></p><p> if(flags[temp]==9) //加號</p><p>
33、;<b> {</b></p><p> cout<<"E'->+T"<<endl;</p><p><b> temp++;</b></p><p><b> T();</b></p><p><b>
34、; }</b></p><p> else if(flags[temp]==12)//減號</p><p><b> {</b></p><p> cout<<"E'->-T"<<endl;</p><p><b> temp++;
35、</b></p><p><b> T();</b></p><p><b> }</b></p><p><b> else</b></p><p> is_right=0;</p><p><b> }</b&g
36、t;</p><p><b> void E2()</b></p><p><b> {</b></p><p> if(flags[temp]==9||flags[temp]==12)//如果是加或減</p><p><b> {</b></p><
37、;p> cout<<"E''->E'E''"<<endl;</p><p><b> E1();</b></p><p><b> E2();</b></p><p><b> }</b></
38、p><p> else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非</p><p><b> {</b></p><p> cout<<"E''->ε"<<endl;</p><p><b>
39、return ;</b></p><p><b> }</b></p><p><b> else</b></p><p> is_right=0;</p><p> T函數(shù): 調(diào)用F函數(shù), 調(diào)用P函數(shù),返回后看是否是’*’或’/’,如果是,則調(diào)用T1函數(shù),再調(diào)用T2函數(shù),如果
40、不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p> T1函數(shù):判斷是不是”*”或者“/” 如果是,調(diào)用F函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p><b> 代碼:</b></p><p><b> void T()</b></p><p><
41、b> {</b></p><p> cout<<"T->FT''"<<endl;</p><p><b> F();</b></p><p><b> T2();</b></p><p><b>
42、 }</b></p><p><b> void T1()</b></p><p><b> {</b></p><p> if(flags[temp]==10) //乘號</p><p><b> {</b></p><p&
43、gt; cout<<"T'->*F"<<endl;</p><p><b> temp++;</b></p><p><b> F();</b></p><p><b> }</b></p><p> else
44、 if(flags[temp]==13) //除號</p><p><b> {</b></p><p> cout<<"T'->/F"<<endl;</p><p><b> temp++;</b></p><p><b>
45、; F();</b></p><p><b> }</b></p><p> else is_right=0;</p><p><b> }</b></p><p><b> void T2()</b></p><p><b&
46、gt; {</b></p><p> if(flags[temp]==10||flags[temp]==13)//如果是乘或除</p><p><b> {</b></p><p> cout<<"T''->T'T''"<<endl;&
47、lt;/p><p><b> T1();</b></p><p><b> T2();</b></p><p><b> }</b></p><p> else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非)</p>
48、<p><b> {</b></p><p> cout<<"T''->ε"<<endl;</p><p><b> return ;</b></p><p><b> }</b></p><p
49、> else is_right=0;</p><p><b> }</b></p><p> F函數(shù):調(diào)用P函數(shù),F(xiàn)1函數(shù)。</p><p> F1函數(shù):判斷是不是”**”,如果是,調(diào)用F函數(shù),如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。</p><p><b> 代碼:</b>
50、;</p><p><b> void F()</b></p><p><b> {</b></p><p> cout<<"F->PF'"<<endl;</p><p><b> P();</b></p&
51、gt;<p><b> F1();</b></p><p><b> }</b></p><p><b> void F1()</b></p><p><b> {</b></p><p> if(flags[temp]==11)
52、 //乘?方?</p><p><b> {</b></p><p> cout<<"F'->**F"<<endl;</p><p><b> temp++;</b></p><p><b> F();</b
53、></p><p><b> }</b></p><p> Elseif(flags[temp]!=0&&flags[temp]!=17&&flags[temp]!=9&&flags[temp]!=12&&flags[temp]!=10&&flags[temp]!=13)/
54、/非#非)非+非-非*非/</p><p><b> {</b></p><p> cout<<"F'->ε?"<<endl;</p><p> is_right=0;</p><p><b> }</b></p>&l
55、t;p><b> }</b></p><p> P函數(shù): 檢查是否標(biāo)識(shí)符,如果是,調(diào)用P1函數(shù),如果不是,檢查是否是數(shù)值,如果是,調(diào)用P1函數(shù),如果不是,檢查是否是’(’,如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。如果是,調(diào)用E函數(shù),返回后檢查是否是’)’,如果不是,進(jìn)行出錯(cuò)處理,置is_right為0。如果是,調(diào)用F1函數(shù),返回。</p><p>&
56、lt;b> 代碼:</b></p><p><b> void P()</b></p><p><b> {</b></p><p> if(flags[temp]==6||flags[temp]==7) //標(biāo)識(shí)符或常數(shù)</p><p><b> {<
57、/b></p><p> cout<<"P->i"<<endl;</p><p><b> temp++;</b></p><p><b> }</b></p><p> else if(flags[temp]==17) //(&l
58、t;/p><p><b> {</b></p><p> cout<<"P->(E)"<<endl;</p><p><b> temp++;</b></p><p><b> E();</b></p><
59、;p> if(flags[temp]==17) //)</p><p><b> {</b></p><p> cout<<"P->(E)"<<endl;</p><p><b> temp++;</b></p><p><b
60、> }</b></p><p><b> else</b></p><p> is_right=0;</p><p><b> }</b></p><p> else is_right =0;</p><p><b> }</b&
61、gt;</p><p><b> 3.中間代碼生成器</b></p><p><b> ?。?)屬性文法 </b></p><p> E→E’+T E.val=E’.val+T.val</p><p> E→E’’-T E.val=E’’.val-T.val</p&g
62、t;<p> E→T E.val=T.val</p><p> T→T’*F T.val=T’.val*F.val</p><p> T→T’’/F T.val=T’’.val/F.val</p><p> T→F T.val=F.val</p><p> F
63、’→P**F F’.val=P.val**F.val</p><p> F’→P F’.val=P.val</p><p> P→(E) P.val=E.val</p><p> F→i F.val=i,lexval</p><p> (2)數(shù)據(jù)結(jié)構(gòu)與函數(shù)說明</p&
64、gt;<p> Strn用來存放臨時(shí)變量的序號。</p><p> temp用來存放數(shù)組的下表,在主程序中語法分析結(jié)束后,置0.</p><p> 定義函數(shù)newtemp()用于門生一個(gè)新的臨時(shí)變量的名字,具體實(shí)現(xiàn)時(shí)每產(chǎn)生一個(gè)T,就及時(shí)送到符號表中,也可以不進(jìn)符號表,直接將單詞值用整數(shù)碼表示。</p><p> 定義函數(shù)siyuan(),輸
65、出一個(gè)四元式。</p><p> 定義函數(shù)YE() 進(jìn)行中間代碼生成</p><p><b> ?。?)流程圖</b></p><p><b> 程序運(yùn)行結(jié)果</b></p><p> 注:本程序?qū)τ谛稳鏰1的標(biāo)識(shí)符無法作為整體識(shí)別</p><p><b>
66、 詞法測試:</b></p><p> 表達(dá)式正確:2*3+4/(as-5)**6#</p><p><b> 詞法分析:</b></p><p><b> 語法分析</b></p><p><b> 四元式:</b></p><p>
67、; 表達(dá)式錯(cuò)誤:2*(3-2#</p><p><b> 六、總結(jié)</b></p><p> 這次課程設(shè)計(jì)使我對編譯原理有了進(jìn)一步的了解,更加鞏固了所學(xué)習(xí)的知識(shí)。編譯原理是一門比較抽象的課程,也比較難以學(xué)得透,有很多東西很模糊的。編譯這個(gè)概念有一定的了解。由于課堂上,學(xué)習(xí)的東西比較淺,難免眼高手低,故而,通過實(shí)驗(yàn)和課程,遇到了很多課本上面見不到的問題,完成實(shí)驗(yàn)后
68、,個(gè)人在成就感的同時(shí),也學(xué)習(xí)到了編程的具體過程中的很多知識(shí)。</p><p><b> 程序代碼:</b></p><p> //#include <stdafx.h></p><p> #include <iostream></p><p> #include<string>
69、</p><p> using namespace std;</p><p> #include<stdio.h></p><p> #include<stdlib.h> </p><p> #include<sstream></p><p> int i,j,k,flag
70、,number,status;</p><p> /*status which is use to judge the string is keywords or not!*/</p><p><b> char ch;</b></p><p> char words[10] = {" "};</p>&
71、lt;p> char program[500];</p><p> int flags[500]; //存儲(chǔ)輸入句子</p><p> string cnt[500];//標(biāo)括識(shí)符</p><p> int temp=0; //數(shù)組下標(biāo)</p><p> int is_right; //判斷輸出信息&l
72、t;/p><p> //-----------------------詞法分析-----------------------------</p><p> int Scan(char program[]) </p><p><b> {</b></p><p> char *keywords[5] = {"
73、while","if","else","switch","case"}; //關(guān)鍵字</p><p><b> number=0;</b></p><p><b> status=0;</b></p><p><b>
74、; j=0;</b></p><p> ch=program[i++];</p><p><b> //遍歷</b></p><p> if ((ch >= 'a') && (ch <= 'z' )||(ch>='A')&&(c
75、h<='Z')) //字母</p><p><b> {</b></p><p> while ((ch >= 'a') && (ch <= 'z' )||(ch>='A')&&(ch<='Z'))</p&
76、gt;<p><b> {</b></p><p> words[j++]=ch;</p><p> ch=program[i++];</p><p><b> }</b></p><p><b> i--;</b></p><p&g
77、t; words[j++] = '\0';</p><p> for (k = 0; k < 5; k++)</p><p> if (strcmp (words,keywords[k]) == 0) //判斷是否為關(guān)鍵字</p><p><b> switch(k)</b></p><p&
78、gt;<b> {</b></p><p><b> case 0:{</b></p><p><b> flag = 1;</b></p><p> status = 1;</p><p><b> break;</b></p>
79、<p><b> }</b></p><p><b> case 1:{</b></p><p><b> flag = 2;</b></p><p> status = 1;</p><p><b> break;</b></p
80、><p><b> }</b></p><p><b> case 2:{</b></p><p><b> flag = 3;</b></p><p> status = 1;</p><p><b> break;</b>
81、</p><p><b> }</b></p><p><b> case 3:{</b></p><p><b> flag = 4;</b></p><p> status = 1;</p><p><b> break;<
82、/b></p><p><b> }</b></p><p><b> case 4:{</b></p><p><b> flag = 5;</b></p><p> status = 1;</p><p><b> brea
83、k;</b></p><p><b> }</b></p><p><b> }</b></p><p> if (status == 0)</p><p><b> {</b></p><p> flag = 6; //標(biāo)識(shí)
84、符</p><p><b> }</b></p><p><b> }</b></p><p> else if ((ch >= '0') && (ch <= '9')) //數(shù)字</p><p><b> {<
85、;/b></p><p> number = 0;</p><p> while ((ch >= '0' ) && (ch <= '9' ))</p><p><b> {</b></p><p> number = number*10+(ch-&
86、#39;0');</p><p> ch = program[i++];</p><p><b> }</b></p><p><b> flag = 7;</b></p><p><b> i--;</b></p><p><b&
87、gt; }</b></p><p> else switch (ch) //運(yùn)算符和標(biāo)點(diǎn)符號</p><p><b> {</b></p><p> case '=':{</p><p> if (ch == '=')<
88、/p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> ch = program[i++];</p><p> if (ch == '=')</p><p><b> {</b></p>
89、;<p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> flag = 14; </p><p><b> }</b></p><p><b> else</b></p><p
90、><b> {</b></p><p><b> i--;</b></p><p><b> flag = 8;</b></p><p><b> }</b></p><p><b> break;</b></p
91、><p><b> }</b></p><p><b> case'>':{</b></p><p> if (ch == '>')</p><p> words[j++] = ch;</p><p> words[j] =
92、'\0';</p><p> ch = program[i++];</p><p> if (ch == '=')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] = '
93、\0';</p><p><b> flag =14;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b>
94、; i--;</b></p><p> flag = 14;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case
95、'<':{</b></p><p> if (ch == '<')</p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> ch = program[i++];</p><p&g
96、t; if (ch == '=')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> flag = 14;</p><p><b>
97、}</b></p><p><b> else</b></p><p><b> {</b></p><p><b> i--;</b></p><p> flag = 14;</p><p><b> }</b&g
98、t;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case'!':{</b></p><p> if (ch == '!')</p><p>
99、words[j++] = ch;</p><p> words[j] = '\0';</p><p> ch = program[i++];</p><p> if (ch == '=')</p><p><b> {</b></p><p> words
100、[j++] = ch;</p><p> words[j] = '\0';</p><p> flag = 14;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b&
101、gt;</p><p><b> i--;</b></p><p> flag = 18;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b><
102、/p><p><b> case'+':{</b></p><p> if (ch == '+')</p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> ch = progra
103、m[i++];</p><p> if (ch == '=')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p><b> flag =
104、9;</b></p><p><b> }</b></p><p> else if (ch == '+')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] =
105、 '\0';</p><p><b> flag = 9;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>&l
106、t;b> i--;</b></p><p><b> flag = 9;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p>
107、<p><b> case'-':{</b></p><p> if (ch == '-')</p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> ch = program[i++];&
108、lt;/p><p> if (ch == '=')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> flag = 12;</p>&l
109、t;p><b> }</b></p><p> else if( ch == '-')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] = '\0';</p>
110、<p> flag = 12;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> i--;</b></p><p>
111、 flag = 12;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case'*':{</b></p><
112、;p> if (ch == '*')</p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> ch = program[i++];</p><p> if (ch == '*')</p><p&
113、gt;<b> {</b></p><p> words[j++] = ch;</p><p> words[j] = '\0';</p><p> flag = 11;</p><p><b> }</b></p><p><b> e
114、lse</b></p><p><b> {</b></p><p><b> i--;</b></p><p> flag = 10;</p><p><b> }</b></p><p><b> break;<
115、/b></p><p><b> }</b></p><p><b> case'/':{</b></p><p> if (ch == '/')</p><p> words[j++] = ch;</p><p> words
116、[j] = '\0';</p><p> ch = program[i++];</p><p> if (ch == '=')</p><p><b> {</b></p><p> words[j++] = ch;</p><p> words[j] =
117、 '\0';</p><p> flag = 13;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> i--;</
118、b></p><p> flag = 13;</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case';':
119、{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p> flag = 15;</p><p><b> break;</b></p><p><b> }</b>
120、;</p><p><b> case'(':{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p> flag = 17;</p><p><b> break;<
121、;/b></p><p><b> }</b></p><p><b> case')':{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p> fl
122、ag = 17;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case'[':{</b></p><p> words[j] = ch;</p><p> wo
123、rds[j+1] = '\0';</p><p> flag = 21;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case']':{</b></p>&
124、lt;p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p> flag = 21;</p><p><b> break;</b></p><p><b> }</b></p><p>&l
125、t;b> case'{':{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p> flag = 20;</p><p><b> break;</b></p><p
126、><b> }</b></p><p><b> case'}':{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p> flag = 20;</p><
127、p><b> break;</b></p><p><b> }</b></p><p><b> case':':{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';
128、</p><p> flag = 22;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case',':{</b></p><p> words[j] = ch;
129、</p><p> words[j+1] = '\0';</p><p> flag = 16;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case'#'
130、:{</b></p><p> words[j] = ch;</p><p> words[j+1] = '\0';</p><p><b> flag = 0;</b></p><p><b> break;</b></p><p>&l
131、t;b> }</b></p><p> case' '://空格</p><p><b> {</b></p><p> words[j] ='_';</p><p> words[j+1] = '\0';</p><p>
132、; flag = 24;</p><p><b> break;</b></p><p><b> }</b></p><p> //case'$':{</p><p> //words[j] = '#';</p><p> //w
133、ords[j+1] = '\0';</p><p> //flag = 0;</p><p><b> //break;</b></p><p><b> //}</b></p><p><b> default:{</b></p><
134、;p> flag = -1;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> return flag;</p><p><b> }
135、</b></p><p> //------------------語法分析(遞歸下降)---------------------------</p><p><b> void E();</b></p><p> void E1();</p><p> void E2();</p>&
136、lt;p> void T(); </p><p> void T1();</p><p> void T2();</p><p><b> void F();</b></p><p> void F1();</p><p><b> void P();</b>
137、;</p><p><b> void E()</b></p><p><b> {</b></p><p> cout<<"E->TE''"<<endl;</p><p><b> T();</b>&l
138、t;/p><p><b> E2();</b></p><p><b> }</b></p><p><b> void E1()</b></p><p><b> {</b></p><p> if(flags[temp]=
139、=9) //加號</p><p><b> {</b></p><p> cout<<"E'->+T"<<endl;</p><p><b> temp++;</b></p><p><b> T();</b&g
140、t;</p><p><b> }</b></p><p> else if(flags[temp]==12)//減號</p><p><b> {</b></p><p> cout<<"E'->-T"<<endl;</p&g
141、t;<p><b> temp++;</b></p><p><b> T();</b></p><p><b> }</b></p><p><b> else</b></p><p> is_right=0;</p>
142、<p><b> }</b></p><p><b> void E2()</b></p><p><b> {</b></p><p> if(flags[temp]==9||flags[temp]==12)//如果是加或減</p><p><b&
143、gt; {</b></p><p> cout<<"E''->E'E''"<<endl;</p><p><b> E1();</b></p><p><b> E2();</b></p><p
144、><b> }</b></p><p> else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非)</p><p><b> {</b></p><p> cout<<"E''->ε"<<endl;
145、</p><p><b> return ;</b></p><p><b> }</b></p><p><b> else</b></p><p> is_right=0;</p><p><b> }</b><
146、/p><p><b> void T()</b></p><p><b> {</b></p><p> cout<<"T->FT''"<<endl;</p><p><b> F();</b></p&
147、gt;<p><b> T2();</b></p><p><b> }</b></p><p><b> void T1()</b></p><p><b> {</b></p><p> if(flags[temp]==10)
148、 //乘號</p><p><b> {</b></p><p> cout<<"T'->*F"<<endl;</p><p><b> temp++;</b></p><p><b> F();</b>
149、;</p><p><b> }</b></p><p> else if(flags[temp]==13) //除號</p><p><b> {</b></p><p> cout<<"T'->/F"<<endl;</p&
150、gt;<p><b> temp++;</b></p><p><b> F();</b></p><p><b> }</b></p><p> else is_right=0;</p><p><b> }</b></p&
151、gt;<p><b> void T2()</b></p><p><b> {</b></p><p> if(flags[temp]==10||flags[temp]==13)//如果是乘或除</p><p><b> {</b></p><p>
152、cout<<"T''->T'T''"<<endl;</p><p><b> T1();</b></p><p><b> T2();</b></p><p><b> }</b></p>&
153、lt;p> else if (flags[temp]!=0||flags[temp]!=17)//如果是非#或非)</p><p><b> {</b></p><p> cout<<"T''->ε"<<endl;</p><p><b> return
154、;</b></p><p><b> }</b></p><p> else is_right=0;</p><p><b> }</b></p><p><b> void F()</b></p><p><b> {&
155、lt;/b></p><p> cout<<"F->PF'"<<endl;</p><p><b> P();</b></p><p><b> F1();</b></p><p><b> }</b>&l
156、t;/p><p><b> void F1()</b></p><p><b> {</b></p><p> if(flags[temp]==11) //乘方</p><p><b> {</b></p><p> cout<&
157、lt;"F'->**F"<<endl;</p><p><b> temp++;</b></p><p><b> F();</b></p><p><b> }</b></p><p> else if (flags[te
溫馨提示
- 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ù)課程設(shè)計(jì)報(bào)告-詞法分析、語法分析、中間代碼生成
- 編譯原理詞法分析器語法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-詞法語法分析器
- c-minus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語法分析的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--pascal語言詞法、語法分析器設(shè)計(jì)
- 編譯課程設(shè)計(jì)-遞歸下降語法分析
- 編譯原理課程設(shè)計(jì)--中間代碼生成器設(shè)計(jì)---逆波蘭式的生成
- 語法分析課程設(shè)計(jì)---編譯原理語法分析器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--- 語法分析器
- 編譯原理課程設(shè)計(jì)---語法分析器
- 編譯原理課程設(shè)計(jì)--語法分析器
- 編譯原理語法分析器課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)(c++)-語法分析器
- 編譯原理課程設(shè)計(jì)詞法分析
- 編譯語法分析實(shí)驗(yàn)報(bào)告
- 編譯原理課程設(shè)計(jì)--詞法分析
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理語法分析
- 編譯原理課程設(shè)計(jì)--表達(dá)式語法分析器
評論
0/150
提交評論