版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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> 學(xué) 號(hào): </p><p> 姓 名: </p><p> 專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 課 程: 編譯原理 &
2、lt;/p><p> 指導(dǎo)教師: </p><p><b> 目錄</b></p><p> 一.程序簡(jiǎn)介與分析---------------------------------------------------------3</p><p> 二.程序適用范圍------------------
3、-----------------------------------------3</p><p> 三.詞法分析---------------------------------------------------------------3</p><p> 四.語(yǔ)法分析--------------------------------------------------------
4、-------4</p><p> 五.語(yǔ)義分析和中間代碼生成------------------------------------------------10</p><p> 六.代碼生成--------------------------------------------------------------12</p><p> 七.流程圖-----
5、-----------------------------------------------------------13</p><p> 八.實(shí)現(xiàn)------------------------------------------------------------------14</p><p> 九.程序運(yùn)行結(jié)果---------------------------------
6、-------------------------14</p><p> 十.總結(jié)------------------------------------------------------------------18</p><p> 十一.附錄(源程序)--------------------------------------------------------18</p&
7、gt;<p><b> 簡(jiǎn)單的編譯程序設(shè)計(jì)</b></p><p><b> 程序簡(jiǎn)介與分析</b></p><p> 本程序由四個(gè)部分組成:詞法分析子程序,語(yǔ)法分析子程序,語(yǔ)義分析子程序,目標(biāo)代碼生成程序。本程序輸入一個(gè)叫l(wèi)ibo.txt的c語(yǔ)言源程序,然后對(duì)它進(jìn)行詞法,語(yǔ)法,語(yǔ)義分析,并輸出匯編代碼。</p>
8、<p> 詞法分析輸入的是c語(yǔ)言源程序,輸出的3是具有獨(dú)立語(yǔ)法意義的單詞符號(hào)。</p><p> 語(yǔ)法分析以詞法分析產(chǎn)生的編碼流為輸入,按照SLR(1)分析方法進(jìn)行語(yǔ)法分析,產(chǎn)生語(yǔ)法樹(shù),輸出移進(jìn)和歸約的動(dòng)作,如果源程序不符合文法,則有“語(yǔ)法分析出錯(cuò)”的提示。</p><p> 語(yǔ)義分析階段,在語(yǔ)法分析的同時(shí),在歸約的時(shí)候,給出相應(yīng)的語(yǔ)義動(dòng)作,最后輸出中間代碼四元式和新的符
9、號(hào)表,如果有未聲明的變量出現(xiàn),則會(huì)提示出出錯(cuò),并顯示出此變量的名稱(chēng)。</p><p> 代碼生成階段,將語(yǔ)義分析得到的中間代碼四元式轉(zhuǎn)化為匯編語(yǔ)言的目標(biāo)代碼并輸出。</p><p><b> 程序適用范圍</b></p><p> 本程序的使用范圍為:整型常量,四則運(yùn)算(為了簡(jiǎn)化問(wèn)題,本程序只考慮加法運(yùn)算和乘法運(yùn)算)和布爾表達(dá)式以及相應(yīng)的
10、賦值語(yǔ)句,條件轉(zhuǎn)移語(yǔ)句和循環(huán)語(yǔ)句。</p><p><b> 詞法分析</b></p><p> 根據(jù)詞法分析的需要,我將源程序中的單詞符號(hào)分為:保留字,字母(標(biāo)識(shí)符),</p><p> 界符三類(lèi),統(tǒng)一用一張表表示如下:</p><p><b> 界符,保留字表</b></p>
11、<p> 程序從源程序文件libo.txt中一次讀入一個(gè)字符,并判斷它是不是字母,界符,</p><p> 保留字,空格,換行,結(jié)束符號(hào)或者非法字符。</p><p><b> 流程圖如下:</b></p><p><b> 詞法分析流程圖</b></p><p><b&
12、gt; 語(yǔ)法分析</b></p><p> ?。闯绦蛑猩婕暗奈姆℅[P]定義如下表:</p><p> .上述文法的每個(gè)非終結(jié)符的FIRST 集和FOLLOW集如下表:</p><p> .文法G[P]的項(xiàng)目集部分如下:</p><p> 0. P’→.P 1. P’→P.</p><p
13、> 2. P→.id()L;R 3. P→id.()L;R 4. P→id(.)L;R </p><p> 5. P→id().L;R 6. P→id()L.;R 7. P→id()L;.R </p><p> 8. P→id()L;R. 9. L→.L;D</p><p> 10.L→L.;D
14、 11. L→L;.D 12. L→L;D. </p><p> 13.D→.id:int 14. D→id .:int 15. D→id: .int </p><p> 16. D→id:int. 17.E→.E+T 18. E→E.+T </p><p> 19.
15、 E→E+.T 20. E→E+T. 21. E→.T </p><p> 22. E→T. 23. T→.T*F 24. T→T.*F </p><p> 25. T→T*.F 26. T→T*F. 27. T→.F </p><p> 2
16、8. T→F. 29. F→ (E) 30. F→ (.E) </p><p> 31. F→ (E.) 32. F→ (E). 33. F→.id </p><p> 34. F→id. </p><p> .再由項(xiàng)目集構(gòu)造文法的DFA活前綴。為了方便,省去了項(xiàng)目族集的每個(gè)
17、狀態(tài)的項(xiàng)目,直接在狀態(tài)轉(zhuǎn)換的箭頭上標(biāo)明終結(jié)符或非終結(jié)符。對(duì)于有規(guī)約動(dòng)作和接受的狀態(tài),將其特別標(biāo)明。文法G[P]的DFA圖如下:</p><p> : int 說(shuō)明語(yǔ)句</p><p> D id D id</p><p> R ; L
18、 ) ( id P</p><p><b> {</b></p><p> if B then M</p><p> id and id
19、 句法</p><p> S id =</p><p> } if id</p><p><b> M N</b></p><p>
20、; S id</p><p> M while</p><p> while B do M</p><p> id and</p><p> id
21、 B</p><p> 布爾表達(dá)式 > and</p><p><b> id</b></p><p> T id</p><p> id
22、( F E</p><p> * (</p><p> F ( id</p><p> F id +</p><p> E ( 表達(dá)式</p><p><
23、b> +</b></p><p> ) T</p><p><b> *</b></p><p> 語(yǔ)義分析和中間代碼生成</p><p> 載語(yǔ)法分析過(guò)程中,隨著分析的步步進(jìn)展,根據(jù)每個(gè)產(chǎn)生式所對(duì)應(yīng)的語(yǔ)義子程序(或語(yǔ)義規(guī)則描述的語(yǔ)義動(dòng)作)進(jìn)行
24、翻譯的辦法稱(chēng)作語(yǔ)法制導(dǎo)翻譯。</p><p><b> 語(yǔ)法制導(dǎo)翻譯</b></p><p> 語(yǔ)法翻譯生成的四元式如下:</p><p><b> 代碼生成</b></p><p> 目標(biāo)代碼生成階段的任務(wù)是把中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。這是編
25、譯的最后階段,它的工作與硬件系統(tǒng)結(jié)構(gòu)和指令含義有關(guān),這個(gè)階段的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運(yùn)用、機(jī)器指令的選擇、各種數(shù)據(jù)類(lèi)型變量的存儲(chǔ)空間分配以及寄存器和后緩寄存器的調(diào)度等。本程序生成的目標(biāo)代碼與0x8086微處理器兼容。</p><p> 下面列舉幾個(gè)簡(jiǎn)單的四元式與匯編代碼的轉(zhuǎn)化列子:</p><p> ?。?,A,B,T)→</p><p> MO
26、V R ,A ;</p><p> ADD R ,B ;</p><p> ST R , T</p><p> . ( *, A , B , T ) →</p><p> MOV R ,A ;</p><p> MUL R ,B ;</p><p> ST R ,
27、 T</p><p> . ( J, _ , _ , L) →</p><p><b> JMP L</b></p><p> . ( J> , A , B , L ) →</p><p> MOV R , A</p><p> CMP R , B</p>
28、<p><b> JB L</b></p><p> . ( =,A , _ ,T ) → </p><p><b> LD R , A</b></p><p><b> ST R , T</b></p><p> 本程序生成的目標(biāo)代碼如下: &
29、lt;/p><p><b> 程序流程圖</b></p><p><b> 編譯程序流程圖</b></p><p><b> 實(shí)現(xiàn)</b></p><p> 本程序運(yùn)行的硬件環(huán)境為CPU1.66HZ ,內(nèi)存為768M .軟件環(huán)境為windows xp</p>
30、<p> 系統(tǒng),Visual C++環(huán)境。</p><p><b> 程序運(yùn)行結(jié)果</b></p><p><b> 輸入源文件路徑:</b></p><p><b> 輸出保留字</b></p><p> 3.輸出符號(hào)表的內(nèi)容</p><
31、;p> 5.輸出語(yǔ)法分析的結(jié)果(本程序采用自下而上的LR語(yǔ)法分析)</p><p><b> 6.輸出中間代碼</b></p><p><b> 7.輸出目標(biāo)代碼</b></p><p><b> 總結(jié)</b></p><p> 通過(guò)本次實(shí)驗(yàn),我對(duì)編譯程序各階段
32、有了更深刻更深入的了解,也糾正了自己在某些方面的的錯(cuò)誤,豐富了自己關(guān)于編譯原理方面的知識(shí)。同時(shí)也培養(yǎng)了自己熱愛(ài)思考,勤查資料的習(xí)慣。由于水平本次實(shí)驗(yàn)涉及面并不是很全面,我只考慮了c語(yǔ)言的一個(gè)子集。當(dāng)然本程序的算法在某些地方也還存在一些缺陷。</p><p><b> 附錄(源程序)</b></p><p> 本程序輸入的c源代碼如下:</p><
33、;p><b> libo()</b></p><p><b> a:int;</b></p><p><b> b:int;</b></p><p><b> ccc:int;</b></p><p><b> d:int;<
34、;/b></p><p><b> {</b></p><p> if ccc>b and ccc>a then a=b+a;</p><p> while ccc>d do a=d;</p><p> a=(b+ccc)*a+d</p><p><b>
35、 }</b></p><p> 本程序的完整源代碼如下:</p><p> #include<cstdio></p><p> #include<iostream></p><p> #include<cstdlib></p><p> #include<
36、;fstream></p><p> #include<string></p><p> #include<cmath></p><p> using namespace std;</p><p> struct token//詞法 token結(jié)構(gòu)體</p><p><b&g
37、t; {</b></p><p> int code;//編碼</p><p> int num;//遞增編號(hào)</p><p> token *next;</p><p><b> };</b></p><p> token *token_head,*token_tail;
38、//token隊(duì)列</p><p> struct str//詞法 string結(jié)構(gòu)體</p><p><b> {</b></p><p> int num;//編號(hào)</p><p> string word;//字符串內(nèi)容</p><p> str *next;</p>
39、<p><b> };</b></p><p> str *string_head,*string_tail;//string隊(duì)列</p><p> struct ivan//語(yǔ)法 產(chǎn)生式結(jié)構(gòu)體</p><p><b> {</b></p><p> char left;//
40、產(chǎn)生式的左部</p><p> string right;//產(chǎn)生式的右部</p><p> int len;//產(chǎn)生式右部的長(zhǎng)度</p><p><b> };</b></p><p> ivan css[20];//語(yǔ)法 20個(gè)產(chǎn)生式</p><p> struct pank//語(yǔ)法
41、 action表結(jié)構(gòu)體</p><p><b> {</b></p><p> char sr;//移進(jìn)或歸約</p><p> int state;//轉(zhuǎn)到的狀態(tài)編號(hào)</p><p><b> };</b></p><p> pank action[46][18]
42、;//action表</p><p> int go_to[46][11];//語(yǔ)法 go_to表</p><p> struct ike//語(yǔ)法 分析棧結(jié)構(gòu)體,雙鏈</p><p><b> {</b></p><p><b> ike *pre;</b></p><p
43、> int num;//狀態(tài)</p><p> int word;//符號(hào)編碼</p><p> ike *next;</p><p><b> };</b></p><p> ike *stack_head,*stack_tail;//分析棧首尾指針</p><p> stru
44、ct L//語(yǔ)義四元式的數(shù)據(jù)結(jié)構(gòu)</p><p><b> {</b></p><p><b> int k;</b></p><p> string op;//操作符</p><p> string op1;//操作數(shù)</p><p> string op2;//
45、操作數(shù)</p><p> string result;//結(jié)果</p><p> L *next;//語(yǔ)義四元式向后指針</p><p> L *Ltrue;//回填true鏈向前指針</p><p> L *Lfalse;//回填false鏈向前指針</p><p><b> };</b&g
46、t;</p><p> L *L_four_head,*L_four_tail,*L_true_head,*L_false_head;/*四元式鏈,true鏈,false鏈*/</p><p> struct symb//語(yǔ)義輸入時(shí)符號(hào)表</p><p><b> {</b></p><p> string wo
47、rd;//變量名稱(chēng)</p><p> int addr;//變量地址</p><p> symb *next;</p><p><b> };</b></p><p> symb *symb_head,*symb_tail;//語(yǔ)義符號(hào)鏈表</p><p> //////////////
48、//////////////////詞法分析有關(guān)函數(shù)聲明</p><p> void outdaima() ;</p><p> void scan();//按字符讀取源文件</p><p> void cifa_main();//詞法分析主程序</p><p> int judge(char ch);//判斷輸入字符的類(lèi)型</
49、p><p> void out1(char ch);//寫(xiě)入token.txt</p><p> void out3(char ch,string word);//寫(xiě)入string.txt</p><p> void input1(token *temp);//插入結(jié)點(diǎn)到隊(duì)列token</p><p> void input3(str *
50、temp);//插入結(jié)點(diǎn)到隊(duì)列string</p><p> void output();//輸出三個(gè)隊(duì)列的內(nèi)容</p><p> void outfile();//輸出三個(gè)隊(duì)列的內(nèi)容到相應(yīng)文件中</p><p> ////////////////////////////////語(yǔ)法分析有關(guān)函數(shù)聲明</p><p> void yuf
51、a_main();//語(yǔ)法分析主程序</p><p> void yufa_initialize();//初始化語(yǔ)法分析數(shù)據(jù)結(jié)構(gòu)</p><p> int yufa_SLR1(int a);//語(yǔ)法分析主體部分</p><p> int ID1(int a);//給輸入字符編號(hào),轉(zhuǎn)化成action表列編號(hào)</p><p> strin
52、g ID10(int i);//給輸入字符反編號(hào)</p><p> int ID2(char ch);//給非終結(jié)狀態(tài)編號(hào),轉(zhuǎn)化成go_to表列編號(hào)</p><p> int ID20(char ch);//給非終結(jié)狀態(tài)編號(hào)</p><p> char ID21(int j);//給非終結(jié)狀態(tài)反編號(hào)</p><p> void add
53、(ike *temp);//給ike分析棧鏈表增加一個(gè)結(jié)點(diǎn)</p><p> void del();//給ike分析棧鏈表刪除一個(gè)結(jié)點(diǎn)</p><p> /////////////////////////////////語(yǔ)義分析相關(guān)函數(shù)的聲明</p><p> void yuyi_main(int m);//語(yǔ)義分析主程序</p><p&g
54、t; void add_L_four(L *temp);//向四元式鏈中加一個(gè)結(jié)點(diǎn)</p><p> void add_L_true(L *temp);//向true鏈中加一個(gè)結(jié)點(diǎn)</p><p> void add_L_false(L *temp);//向false鏈中加一個(gè)結(jié)點(diǎn)</p><p> void add_symb(symb *temp);//向
55、語(yǔ)義符號(hào)表鏈中加一個(gè)結(jié)點(diǎn)</p><p> void output_yuyi();//輸出中間代碼四元式和最后符號(hào)表</p><p> string newop(int m);//把數(shù)字變成字符串</p><p> string id_numtoname(int num);//把編號(hào)轉(zhuǎn)換成相應(yīng)的變量名</p><p> int loo
56、kup(string m);//變量聲明檢查</p><p> /////////////////////////////////全局變量的聲明</p><p> FILE *fp;//文件指針</p><p> int wordcount;//標(biāo)志符計(jì)數(shù)</p><p> int err;//標(biāo)志詞法分析結(jié)果正確或錯(cuò)誤</p&
57、gt;<p> int nl;//讀取行數(shù)</p><p> int yuyi_linshi;//語(yǔ)義臨時(shí)變量</p><p> string E_name,T_name,F_name,M_name,id_name,id1_name,id2_name,errword;//用于歸約時(shí)名稱(chēng)傳遞和未聲明變量的輸出</p><p> int id_nu
58、m,id1_num,id2_num,id_left,id_while,id_then,id_do;//用于記錄一些特殊的字符位置信息</p><p> ////////////////////////////////主程序開(kāi)始</p><p> int main()</p><p><b> {</b></p><p&
59、gt; cout<<"************************"<<endl;</p><p> cout<<"* 說(shuō)明: *"<<endl;</p><p> cout<<"* 第一部分:詞法分析 *"<<end
60、l;</p><p> cout<<"* 第二部分:語(yǔ)法分析 *"<<endl;</p><p> cout<<"* 第三部分:語(yǔ)義分析 *"<<endl;</p><p> cout<<"* 第四部分:目標(biāo)代碼生成 *"<
61、<endl;</p><p> cout<<"************************"<<endl;</p><p> cifa_main();//詞法</p><p> yufa_main();//語(yǔ)法</p><p> output_yuyi();//語(yǔ)義</p&g
62、t;<p> outdaima(); //代碼生成</p><p> cout<<endl;</p><p> system("pause");</p><p> return(0);</p><p><b> }</b></p><p>
63、 //////////////////////////////////詞法分析子程序</p><p> void cifa_main()</p><p><b> {</b></p><p> token_head=new token;</p><p> token_head->next=NULL;<
64、/p><p> token_tail=new token;</p><p> token_tail->next=NULL;</p><p> string_head=new str;</p><p> string_head->next=NULL;</p><p> string_tail=new s
65、tr;</p><p> string_tail->next=NULL;//初始化三個(gè)隊(duì)列的首尾指針</p><p> L_four_head=new L;</p><p> L_four_head->next=NULL;</p><p> L_four_tail=new L;</p><p>
66、L_four_tail->k=0;</p><p> L_four_tail->next=NULL;</p><p> L_true_head=new L;</p><p> L_true_head->Ltrue=NULL;</p><p> L_false_head=new L;</p><p&
67、gt; L_false_head->Lfalse=NULL;</p><p> symb_head=new symb;</p><p> symb_head->next=NULL;</p><p> symb_tail=new symb;</p><p> symb_tail->next=NULL;</p&g
68、t;<p> yuyi_linshi=-1;</p><p><b> id_num=0;</b></p><p> wordcount=0;//初始化字符計(jì)數(shù)器</p><p> err=0;//初始化詞法分析錯(cuò)誤標(biāo)志</p><p> nl=1;//初始化讀取行數(shù)</p><
69、;p><b> scan();</b></p><p> if(err==0)</p><p><b> {</b></p><p><b> char m;</b></p><p><b> output();</b></p>
70、<p> cout<<"詞法分析正確完成!"<<endl<<endl<<"如果將結(jié)果保存到文件中請(qǐng)輸入 y ,否則請(qǐng)輸入其它字母:";</p><p><b> cin>>m;</b></p><p> cout<<endl;</p
71、><p> if(m=='y')</p><p><b> {</b></p><p> outfile();</p><p> cout<<"結(jié)果成功保存在token.txt和sting.txt兩個(gè)文件中,請(qǐng)打開(kāi)查看"<<endl;</p>
72、<p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void scan()</p><p><b>
73、; {</b></p><p> cout<<endl;</p><p> system("pause");</p><p> cout<<endl;</p><p><b> char ch;</b></p><p> stri
74、ng word;</p><p> char document[50];</p><p> int flag=0;</p><p> cout<<"請(qǐng)輸入源文件路徑及名稱(chēng):";</p><p> cin>>document;</p><p> cout<<
75、;endl;</p><p> cout<<"************************"<<endl;</p><p> cout<<"* 第一部分:詞法分析 *"<<endl;</p><p> cout<<"**************
76、**********"<<endl;</p><p> if((fp=fopen(document,"rt"))==NULL)</p><p><b> {</b></p><p><b> err=1;</b></p><p> cout<&
77、lt;"無(wú)法找到該文件!"<<endl;</p><p><b> return;</b></p><p><b> }</b></p><p> while(!feof(fp))</p><p><b> {</b></p>
78、<p><b> word="";</b></p><p> ch=fgetc(fp);</p><p> flag=judge(ch);</p><p> if(flag==1)</p><p><b> out1(ch);</b></p>
79、<p> else if(flag==3)</p><p> out3(ch,word);</p><p> else if(flag==4 || flag==5 ||flag==6)</p><p><b> continue;</b></p><p><b> else</b&g
80、t;</p><p><b> {</b></p><p> cout<<nl<<"行 "<<"錯(cuò)誤:非法字符! "<<ch<<endl;</p><p><b> err=1;</b></p>&l
81、t;p><b> }</b></p><p><b> }</b></p><p> fclose(fp);</p><p><b> }</b></p><p> int judge(char ch)</p><p><b>
82、 {</b></p><p> int flag=0;</p><p> if(ch=='=' || ch=='+' || ch=='*' || ch=='>' || ch==':' || ch==';' || ch=='{' || ch=='}&
83、#39; || ch=='(' || ch==')')</p><p> flag=1;//界符</p><p> else if(('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z'))</p&
84、gt;<p> flag=3;//字母</p><p> else if(ch==' ')</p><p> flag=4;//空格</p><p> else if(feof(fp))</p><p> flag=5;//結(jié)束</p><p> else if(ch==
85、9;\n')</p><p><b> {</b></p><p> flag=6;//換行</p><p><b> nl++;</b></p><p><b> }</b></p><p><b> else</b&
86、gt;</p><p> flag=0;//非法字符</p><p> return(flag);</p><p><b> }</b></p><p> void out1(char ch)</p><p><b> {</b></p><p&
87、gt;<b> int id;</b></p><p> switch(ch)</p><p><b> {</b></p><p> case '=' : id=1;break;</p><p> case '+' : id=2;break;</p&
88、gt;<p> case '*' : id=3;break;</p><p> case '>' : id=4;break;</p><p> case ':' : id=5;break;</p><p> case ';' : id=6;break;</p>
89、<p> case '{' : id=7;break;</p><p> case '}' : id=8;break;</p><p> case '(' : id=9;break;</p><p> case ')' : id=10;break;//界符編碼</p>&
90、lt;p> default : id=0;</p><p><b> }</b></p><p> token *temp;</p><p> temp=new token;</p><p> temp->code=id;</p><p> temp->num=-1;
91、</p><p> temp->next=NULL;</p><p> input1(temp);</p><p><b> return;</b></p><p><b> }</b></p><p> void out3(char ch,string wo
92、rd)</p><p><b> {</b></p><p> token *temp;</p><p> temp=new token;</p><p> temp->code=-1;</p><p> temp->num=-1;</p><p>
93、 temp->next=NULL;</p><p> str *temp1;</p><p> temp1=new str;</p><p> temp1->num=-1;</p><p> temp1->word="";</p><p> temp1->next=
94、NULL;</p><p> int flag=0;</p><p> word=word+ch;</p><p> ch=fgetc(fp);</p><p> flag=judge(ch);</p><p> if(flag==1 || flag==4 || flag==5 || flag==6)<
95、/p><p><b> {</b></p><p> if(word=="and" || word=="if" || word=="then" || word=="while" || word=="do" || word=="int")</p&
96、gt;<p><b> {</b></p><p> if(word=="and")</p><p> temp->code=31;</p><p> else if(word=="if")</p><p> temp->code=32;<
97、/p><p> else if(word=="then")</p><p> temp->code=33;</p><p> else if(word=="while")</p><p> temp->code=35;</p><p> else if(word
98、=="do")</p><p> temp->code=36;</p><p> else if(word=="int")</p><p> temp->code=37;//關(guān)鍵字編碼</p><p> input1(temp);</p><p> if(f
99、lag==1)</p><p><b> out1(ch);</b></p><p> else if(flag==4 || flag==5 || flag==6)</p><p><b> return;</b></p><p><b> }</b></p>
100、;<p> else if(flag==1)</p><p><b> {</b></p><p> wordcount++;</p><p> temp->code=25;</p><p> temp->num=wordcount;</p><p> inp
101、ut1(temp);</p><p> temp1->num=wordcount;</p><p> temp1->word=word;</p><p> input3(temp1);</p><p><b> out1(ch);</b></p><p><b>
102、}</b></p><p> else if(flag==4 || flag==5 || flag==6)</p><p><b> {</b></p><p> wordcount++;</p><p> temp->code=25;</p><p> temp-&g
103、t;num=wordcount;</p><p> input1(temp);</p><p> temp1->num=wordcount;</p><p> temp1->word=word;</p><p> input3(temp1);</p><p><b> }</b&g
104、t;</p><p><b> return;</b></p><p><b> }</b></p><p> else if(flag==2 || flag==3)</p><p> out3(ch,word);//形成字符串</p><p><b>
105、else</b></p><p><b> {</b></p><p><b> err=1;</b></p><p> cout<<nl<<"行 "<<"錯(cuò)誤:非法字符! "<<ch<<endl;&l
106、t;/p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> void input1(token *temp)</p><p><b> {</b&
107、gt;</p><p> if(token_head->next == NULL)</p><p><b> {</b></p><p> token_head->next=temp;</p><p> token_tail->next=temp;</p><p><
108、;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> token_tail->next->next=temp;</p><p> token_tail->next=temp;</p&
109、gt;<p><b> }</b></p><p><b> }</b></p><p> void input3(str *temp)</p><p><b> {</b></p><p> if(string_head->next == NUL
110、L)</p><p><b> {</b></p><p> string_head->next=temp;</p><p> string_tail->next=temp;</p><p><b> }</b></p><p><b> el
111、se</b></p><p><b> {</b></p><p> string_tail->next->next=temp;</p><p> string_tail->next=temp;</p><p><b> }</b></p><
112、;p><b> }</b></p><p> void output()</p><p><b> {</b></p><p> cout<<"token表內(nèi)容如下:"<<endl;</p><p> token *temp1;</p
113、><p> temp1=new token;</p><p> temp1=token_head->next;</p><p> while(temp1!=NULL)</p><p><b> {</b></p><p> cout<<temp1->code;<
114、/p><p> if(temp1->num == -1)</p><p><b> {</b></p><p> cout<<endl;</p><p><b> }</b></p><p><b> else</b></p
115、><p><b> {</b></p><p> cout<<" "<<temp1->num<<endl;</p><p><b> }</b></p><p> temp1=temp1->next;</p>
116、<p><b> }</b></p><p> cout<<"符號(hào)表內(nèi)容如下:"<<endl;</p><p> str *temp3;</p><p> temp3=new str;</p><p> temp3=string_head->next;
117、</p><p> while(temp3!=NULL)</p><p><b> {</b></p><p> cout<<temp3->num<<" "<<temp3->word<<endl;</p><p> temp3=t
118、emp3->next;</p><p><b> }</b></p><p><b> }</b></p><p> void outfile()</p><p><b> {</b></p><p> ofstream fout1(&q
119、uot;token.txt");//寫(xiě)文件</p><p> ofstream fout3("string.txt");</p><p> token *temp1;</p><p> temp1=new token;</p><p> temp1=token_head->next;</p&g
120、t;<p> while(temp1!=NULL)</p><p><b> {</b></p><p> fout1<<temp1->code;</p><p> if(temp1->num == -1)</p><p> fout1<<endl;</p
121、><p><b> else</b></p><p> fout1<<" "<<temp1->num<<endl;</p><p> temp1=temp1->next;</p><p><b> }</b></p&g
122、t;<p> str *temp3;</p><p> temp3=new str;</p><p> temp3=string_head->next;</p><p> while(temp3!=NULL)</p><p><b> {</b></p><p>
123、fout3<<temp3->num<<" "<<temp3->word<<endl;</p><p> temp3=temp3->next;</p><p><b> }</b></p><p><b> }</b></p
124、><p> /////////////////////////////////////////語(yǔ)法分析子程序</p><p> void yufa_main()</p><p><b> {</b></p><p> if(err==0)</p><p><b> {</b&
125、gt;</p><p> system("pause");</p><p> cout<<endl;</p><p> cout<<"************************"<<endl;</p><p> cout<<"*
126、第二部分:語(yǔ)法分析 *"<<endl;</p><p> cout<<"************************"<<endl;</p><p> yufa_initialize();//初始化語(yǔ)法分析數(shù)據(jù)結(jié)構(gòu)</p><p> token *temp;</p><
127、p> temp=new token;</p><p> temp=token_head->next;</p><p><b> int p,q;</b></p><p><b> p=0;</b></p><p><b> q=0;</b></p&g
128、t;<p> cout<<"語(yǔ)法分析過(guò)程如下:"<<endl;</p><p> while(temp!=NULL)</p><p><b> {</b></p><p><b> int w;</b></p><p> w=ID1
129、(temp->code);</p><p> p=yufa_SLR1(w);</p><p> if(p==1) break;</p><p><b> if(p==0)</b></p><p> temp=temp->next;</p><p> if(temp==NULL
130、) q=1;</p><p><b> }//語(yǔ)法分析</b></p><p><b> if(q==1)</b></p><p><b> while(1)</b></p><p><b> {</b></p><p>
131、 p=yufa_SLR1(17);</p><p> if(p==3) break;</p><p> }//最后輸入$來(lái)完成語(yǔ)法分析</p><p><b> }</b></p><p><b> }</b></p><p> void yufa_initiali
132、ze()</p><p><b> {</b></p><p> stack_head=new ike;</p><p> stack_tail=new ike;</p><p> stack_head->pre=NULL;</p><p> stack_head->nex
133、t=stack_tail;</p><p> stack_head->num=0;</p><p> stack_head->word='!';</p><p> stack_tail->pre=stack_head;</p><p> stack_tail->next=NULL;//初始化棧分
134、析鏈表</p><p> css[0].left='Q';</p><p> css[0].right="P";</p><p> css[1].left='P';</p><p> css[1].right="id()L;R";</p><p
135、> css[2].left='L';</p><p> css[2].right="L;D";</p><p> css[3].left='L';</p><p> css[3].right="D";</p><p> css[4].left='D
136、';</p><p> css[4].right="id:int";</p><p> css[5].left='E';</p><p> css[5].right="E+T";</p><p> css[6].left='E';</p>&
137、lt;p> css[6].right="T";</p><p> css[7].left='T';</p><p> css[7].right="T*F";</p><p> css[8].left='T';</p><p> css[8].right=&
138、quot;F";</p><p> css[9].left='F';</p><p> css[9].right="(E)";</p><p> css[10].left='F';</p><p> css[10].right="id";</p&g
139、t;<p> css[11].left='B';</p><p> css[11].right="B and B";</p><p> css[12].left='B';</p><p> css[12].right="id>id";</p><p
140、> css[13].left='M';</p><p> css[13].right="id=E";</p><p> css[14].left='S';</p><p> css[14].right="if B then M";</p><p> css
141、[15].left='S';</p><p> css[15].right="while B do M";</p><p> css[16].left='S';</p><p> css[16].right="M";</p><p> css[17].left=&
142、#39;N';</p><p> css[17].right="N;S";</p><p> css[18].left='N';</p><p> css[18].right="S";</p><p> css[19].left='R';</p>
143、;<p> css[19].right="{N}";</p><p><b> int i,j;</b></p><p> for(i=0;i<20;i++)</p><p><b> {</b></p><p> char *css_len;<
144、;/p><p> css_len=&css[i].right[0];</p><p> css[i].len=strlen(css_len);</p><p><b> }</b></p><p> css[1].len=6;</p><p> css[4].len=3;</p
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- c語(yǔ)言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)____c語(yǔ)言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)---c語(yǔ)言編譯器的實(shí)現(xiàn)
- 編譯原理課程的設(shè)計(jì)--c語(yǔ)言編譯器
- 編譯原理課程設(shè)計(jì)___c語(yǔ)言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)---s語(yǔ)言的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---簡(jiǎn)單編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- c語(yǔ)言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語(yǔ)法分析的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告-簡(jiǎn)單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 小型c語(yǔ)言編譯器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-pl_0編譯器及其擴(kuò)充
- 編譯原理課程設(shè)計(jì)報(bào)告--pl0編譯器的擴(kuò)充
評(píng)論
0/150
提交評(píng)論