版權(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> LR(0)分析器自動(dòng)構(gòu)造程序的實(shí)現(xiàn)</p><p> 2009 年 12 月 </p><p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p><b> 目 錄</b></p
2、><p> 第一章 概 述4</p><p> 第二章 設(shè)計(jì)的基本原理5</p><p> 2.1 識(shí)別文法的LR(0)項(xiàng)目集規(guī)范族的構(gòu)造5</p><p> 2.2 LR(0)分析表的構(gòu)造5</p><p> 2.3 LR(0)分析器總控程序構(gòu)造6</p><p
3、> 第三章 程序設(shè)計(jì)7</p><p> 3.1 程序總體構(gòu)架7</p><p> 3.2 程序存儲(chǔ)結(jié)構(gòu)8</p><p> 3.2.1 符號(hào)表存儲(chǔ)結(jié)構(gòu)8</p><p> 3.2.2 產(chǎn)生式表存儲(chǔ)結(jié)構(gòu)8</p><p> 3.2.3 項(xiàng)目集規(guī)范族表存儲(chǔ)結(jié)構(gòu)9</p&
4、gt;<p> 3.2.4 LR(0)分析表存儲(chǔ)結(jié)構(gòu)9</p><p> 3.3 程序算法10</p><p> 3.3.1 項(xiàng)目集規(guī)范族的構(gòu)造10</p><p> 3.3.2 LR(0)分析表構(gòu)造11</p><p> 第四章 程序測(cè)試12</p><p> 4.1
5、 符號(hào)表測(cè)試12</p><p> 4.2 產(chǎn)生式表測(cè)試13</p><p> 4.3 項(xiàng)目集規(guī)范族表測(cè)試13</p><p> 4.4 LR(0)分析表測(cè)試14</p><p> 4.5 LR(0)分析器測(cè)試14</p><p> 第五章 總結(jié)和展望15</p>&
6、lt;p><b> 參考文獻(xiàn)16</b></p><p><b> 附錄17</b></p><p> 第一章 概 述</p><p> 本課程設(shè)計(jì)完成了以下內(nèi)容:</p><p> 1. 實(shí)現(xiàn)了對(duì)任意給定的文法,識(shí)別文法活前綴的、的狀態(tài)轉(zhuǎn)化矩陣及項(xiàng)目集規(guī)范族的構(gòu)造;&l
7、t;/p><p> 2. 判斷該文法是否為文法,實(shí)現(xiàn)了分析表的構(gòu)造,并輸出到指定文件中;</p><p> 3. 實(shí)現(xiàn)了分析器總控程序,對(duì)輸入的表達(dá)式進(jìn)行文法分析。</p><p> 第二章 設(shè)計(jì)的基本原理</p><p> 本課程設(shè)計(jì)的核心算法[1]主要有三點(diǎn):1. 識(shí)別文法活前綴的、的狀態(tài)轉(zhuǎn)化矩陣及項(xiàng)目集規(guī)范族的構(gòu)造;2.分析表
8、的構(gòu)造;3.分析器總控程序的構(gòu)造。</p><p> 2.1 識(shí)別文法的LR(0)項(xiàng)目集規(guī)范族的構(gòu)造</p><p> 采用(閉包)的構(gòu)造一個(gè)文法的項(xiàng)目規(guī)范簇。</p><p> 假定是文法的任一項(xiàng)目集,定義和構(gòu)造的閉包的算法:</p><p> ?。?)的任何項(xiàng)目都屬于;</p><p> ?。?)若屬于,那
9、么,對(duì)任何關(guān)于的產(chǎn)生式,項(xiàng)目也屬于;</p><p> (3)重復(fù)執(zhí)行上述兩個(gè)步驟直至不再增大。</p><p> 其中初始,為對(duì)文法進(jìn)行拓廣構(gòu)造而引進(jìn)的不出現(xiàn)在中的非終結(jié)符。</p><p> 定義狀態(tài)轉(zhuǎn)換函數(shù),的第一個(gè)變?cè)且粋€(gè)項(xiàng)目集,第二個(gè)變?cè)且粋€(gè)文法符號(hào)。函數(shù)值定義為。</p><p> 其中 = {任何形如的項(xiàng)目|屬于}
10、</p><p> 2.2 LR(0)分析表的構(gòu)造</p><p> 假定。令每個(gè)項(xiàng)目集的下標(biāo)作為分析器的狀態(tài)。特別是,令那個(gè)包含項(xiàng)目的集合的下標(biāo)為分析器的初態(tài)。分析表的子表和子表可按如下方法構(gòu)造:</p><p> ?。?)若項(xiàng)目屬于且,為終結(jié)符,則置為“把移近?!?,簡(jiǎn)記為“”。</p><p> ?。?)若項(xiàng)目屬于,那么對(duì)于任何終結(jié)
11、符(或結(jié)束符#),置為“用產(chǎn)生式進(jìn)行規(guī)約”,簡(jiǎn)記為“”(假定產(chǎn)生式是文法的第j個(gè)產(chǎn)生式)</p><p> ?。?)若項(xiàng)目屬于,則置為“接受”,簡(jiǎn)記為“acc”。</p><p><b> (4)若,則置。</b></p><p> (5)分析表中凡不能用規(guī)則1~4填入信息的空白處均置上“報(bào)錯(cuò)標(biāo)志”。如果分析表中任何一項(xiàng)被重復(fù)填入,則說明分
12、析表的入口不是唯一的,項(xiàng)目集中存在沖突項(xiàng)目,該文法不是文法。</p><p> 2.3 LR(0)分析器總控程序構(gòu)造</p><p> 分析表包括量部分,“動(dòng)作”表和“狀態(tài)轉(zhuǎn)換”表。規(guī)定了當(dāng)狀態(tài)面臨輸入符號(hào)時(shí)應(yīng)采取什么動(dòng)作。規(guī)定了狀態(tài)面對(duì)文法符號(hào)時(shí)下一狀態(tài)是什么。</p><p> 每一項(xiàng)所規(guī)定的動(dòng)作不外乎是下述四種可能之一。</p><
13、p> (1)移進(jìn) 把的下一狀態(tài)和輸入符號(hào)推進(jìn)棧,下一輸入符號(hào)變成現(xiàn)行輸入符號(hào)。</p><p> ?。?)歸約 指用某一產(chǎn)生式進(jìn)行規(guī)約。假若的長(zhǎng)度為,規(guī)約的動(dòng)作是,去除棧頂?shù)膫€(gè)項(xiàng),使?fàn)顟B(tài)變成棧頂狀態(tài),然后把的下一狀態(tài)推進(jìn)棧。規(guī)約動(dòng)作不改變現(xiàn)行輸入符號(hào)。規(guī)約動(dòng)作不改變現(xiàn)行輸入符號(hào)。</p><p> ?。?)接受 宣布分析成功,停止分析器工作</p><p&
14、gt; ?。?)報(bào)錯(cuò) 發(fā)現(xiàn)源程序含有錯(cuò)誤,調(diào)用出錯(cuò)處理程序。</p><p> 第三章 程序設(shè)計(jì)</p><p> 3.1 程序總體構(gòu)架</p><p> 本課程設(shè)計(jì)開發(fā)的程序主要由4張表組成,分別為:符號(hào)表、產(chǎn)生式表、表和項(xiàng)目集規(guī)范簇表。同時(shí),項(xiàng)目集規(guī)范簇表包含一個(gè)分析棧作為分析器總控程序。產(chǎn)生式表包含符號(hào)表作為子表,項(xiàng)目集規(guī)范簇表包含產(chǎn)生式表、表
15、作為子表。</p><p><b> 程序工作流程:</b></p><p> 1. 讀取含有文法規(guī)則的文件,為該文法中的每一個(gè)不同的文法符號(hào)(終結(jié)符和非終結(jié)符分配一個(gè)編號(hào)),記錄文法符號(hào)的屬性(終結(jié)符/非終結(jié)符),存儲(chǔ)于一張符號(hào)表中;</p><p> 2. 再次讀取文件,將產(chǎn)生式存儲(chǔ)于產(chǎn)生式表中;</p><p&g
16、t; 3. 根據(jù)產(chǎn)生式構(gòu)建項(xiàng)目集規(guī)范族,存儲(chǔ)于表中;</p><p> 4. 根據(jù)構(gòu)建的項(xiàng)目集規(guī)范族構(gòu)建分析表,填寫分析表同時(shí)檢查該文法是否為文法;</p><p> 5. 對(duì)于輸入的表達(dá)式,分析器根據(jù)構(gòu)建的分析表進(jìn)行文法分析,給出分析結(jié)果。</p><p> 3.2 程序存儲(chǔ)結(jié)構(gòu)</p><p> 3.2.1 符號(hào)表存儲(chǔ)結(jié)構(gòu)&
17、lt;/p><p> 3.2.2 產(chǎn)生式表存儲(chǔ)結(jié)構(gòu)</p><p> 3.2.3 項(xiàng)目集規(guī)范族表存儲(chǔ)結(jié)構(gòu)</p><p> 1)定義二元組 : </p><p> ?。寒a(chǎn)生式標(biāo)號(hào),與中的一致</p><p> ?。阂粋€(gè)產(chǎn)生式的第個(gè)項(xiàng)目,可由中的幫助確定 </p><p> 如:產(chǎn)
18、生式 : , </p><p><b> 2)結(jié)構(gòu):</b></p><p> 3.2.4 LR(0)分析表存儲(chǔ)結(jié)構(gòu)</p><p><b> 3.3 程序算法</b></p><p> 3.3.1 項(xiàng)目集規(guī)范族的構(gòu)造</p><p> 1. (初始化
19、)將初始條件作為該狀態(tài)頭結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn),并構(gòu)造該孩子結(jié)點(diǎn)的閉包,連接其后,指向第一個(gè)狀態(tài)頭結(jié)點(diǎn),指向第一個(gè)狀態(tài)頭結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn);</p><p> 2. 查看,若為空,停止;若不為空,轉(zhuǎn)3;</p><p> 3. 查看,若為空,轉(zhuǎn)4;若不為空,構(gòu)造的,檢查該狀態(tài)與之前構(gòu)造的狀態(tài)有無重復(fù),若重復(fù),則停止構(gòu)造,的填寫重復(fù)的已存在的狀態(tài)的編號(hào);若不重復(fù),則作為一個(gè)新狀態(tài),連
20、接于,并構(gòu)造其閉包連接其后,指向。轉(zhuǎn)2;</p><p> 4. 指向下一狀態(tài),若下一狀態(tài)為空,則結(jié)束,否則,指向下一狀態(tài)頭結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn),轉(zhuǎn)3。</p><p><b> 具體細(xì)節(jié):</b></p><p> 設(shè)所指項(xiàng)目為,因?yàn)橐獙?duì)其構(gòu)造閉包,該項(xiàng)目一定不是終態(tài),所以區(qū)分項(xiàng)目的圓點(diǎn)符號(hào)位于第個(gè)標(biāo)識(shí)符的左側(cè)。現(xiàn)在構(gòu)造的閉包,分兩個(gè)
21、步驟實(shí)現(xiàn):</p><p><b> 1. 構(gòu)造的: </b></p><p> 查看中編號(hào)為的產(chǎn)生式,取得該產(chǎn)生式的長(zhǎng)度屬性</p><p> 若,則停止構(gòu)造當(dāng)前閉包(已是終態(tài)),此時(shí) 的項(xiàng)填;</p><p> 否則,將作為該閉包的第一個(gè)項(xiàng)目,此時(shí) 的項(xiàng)填該
22、新狀態(tài)的狀態(tài)編號(hào)。</p><p> 2. 構(gòu)造該孩子結(jié)點(diǎn)的閉包 :</p><p> 查看中編號(hào)為的產(chǎn)生式的第個(gè)標(biāo)識(shí)符,取得該標(biāo)識(shí)符的,查看中該標(biāo)識(shí)符的類別屬性</p><p> 若為1(非終結(jié)符),則查看非終結(jié)符的所有產(chǎn)生 式,記這些產(chǎn)生式的編號(hào)為,將所有的加入閉包</p><p><b> 否則,結(jié)束<
23、;/b></p><p> 3. 檢查該狀態(tài)與之前構(gòu)造的狀態(tài)有無重復(fù) :</p><p> 斷言:任意兩個(gè)狀態(tài),只要不同,則即為不同狀態(tài)。</p><p> 3.3.2 LR(0)分析表構(gòu)造</p><p> 對(duì)于編號(hào)為的狀態(tài),現(xiàn)依據(jù)其項(xiàng)目填寫分析表:</p><p> 1. 如果該項(xiàng)目形如,查看該項(xiàng)
24、目的屬性, </p><p> 1)若為終結(jié)符,則在表的狀態(tài)對(duì)應(yīng)行,對(duì)應(yīng)列,填寫,表示將把移進(jìn)棧</p><p> 2)若為非終結(jié)符,則在表的狀態(tài)對(duì)應(yīng)行,對(duì)應(yīng)列,填寫,表示狀態(tài)轉(zhuǎn)移至狀態(tài)</p><p> 2. 如果該項(xiàng)目形如</p><p> 1)若為起始符號(hào),則置在表的狀態(tài)對(duì)應(yīng)行,對(duì)應(yīng)列,填寫,表示接受。</p>&
25、lt;p> 2)否則,對(duì)任何終結(jié)符或結(jié)束符,則在表的狀態(tài)對(duì)應(yīng)行,對(duì)應(yīng)列,填寫,表示用產(chǎn)生式進(jìn)行規(guī)約。</p><p> 第四章 程序測(cè)試</p><p><b> 以文法G為例:</b></p><p> 程序模塊輸入:含上述文法的文件,下面展示個(gè)模塊的輸出結(jié)果</p><p> 4.1 符號(hào)表測(cè)
26、試</p><p> 輸出結(jié)果為 <符號(hào)編號(hào),符號(hào),是否為終結(jié)符></p><p><b> 與預(yù)期結(jié)果相同</b></p><p> 4.2 產(chǎn)生式表測(cè)試</p><p> 輸出結(jié)果與讀入的文件中的產(chǎn)生式相同,且產(chǎn)生式中符號(hào)的編號(hào)正確</p><p> 4.3 項(xiàng)目集規(guī)
27、范族表測(cè)試</p><p> 輸出結(jié)果為 <狀態(tài)編號(hào)> :<產(chǎn)生式編號(hào),產(chǎn)生式項(xiàng)目編號(hào),項(xiàng)目轉(zhuǎn)移的目標(biāo)狀態(tài)></p><p><b> 與預(yù)期結(jié)果相同</b></p><p> 4.4 LR(0)分析表測(cè)試</p><p> 輸出結(jié)果為分析表,與預(yù)期結(jié)果相同</p><
28、;p> 4.5 LR(0)分析器測(cè)試</p><p><b> 以輸入字符串和為例</b></p><p> 表達(dá)式的分析結(jié)果正確</p><p> 第五章 總結(jié)和展望</p><p> 完成了編譯原理課程設(shè)計(jì)之后,我感到十分的疲憊,但是那一份富有成就感的欣喜卻勝過了那十分的疲憊。由于本次選題匆忙
29、,選了一道比較有難度的題目,在做課程設(shè)計(jì)的過程中,我翻閱了很多相關(guān)資料,對(duì)課本中點(diǎn)到即止的知識(shí)進(jìn)行了更加深入的學(xué)習(xí),有了更加深入的理解。做課程設(shè)計(jì)的過程是痛苦的,我在這一個(gè)星期內(nèi)多次熬夜戰(zhàn)斗,有時(shí)甚至顧不上吃飯,只為了揪出程序中的錯(cuò)誤,只為了精益求精的完成這個(gè)課程設(shè)計(jì)。就在我寫這份總結(jié)的時(shí)候,我發(fā)現(xiàn)自己我一點(diǎn)也不累了,反而很興奮,很有成就感。</p><p> 通過本次課程設(shè)計(jì),我發(fā)現(xiàn)實(shí)踐是檢驗(yàn)學(xué)習(xí)深度、學(xué)習(xí)成
30、果的唯一途徑,課本上的知識(shí)點(diǎn)都是濃縮的精華,在理論闡述上不可能做到面面俱到,學(xué)到的知識(shí)當(dāng)然也不可能直接運(yùn)用到實(shí)際情況上。在實(shí)踐的過程中,我們需要將我們學(xué)習(xí)到的知識(shí)進(jìn)行一定程度的擴(kuò)充,本次課程設(shè)計(jì)涉及到算法,LR分析器自動(dòng)構(gòu)造程序的機(jī)制原理以及C++語言。在用C++語言實(shí)現(xiàn)本次課程設(shè)計(jì)的過程中,我更加熟悉了C++語言的語法機(jī)制,語言規(guī)范;在實(shí)現(xiàn)LR分析器自動(dòng)構(gòu)造程序的過程中,我更加熟悉了其構(gòu)造程序的原理以及與之相關(guān)的算法。</p&g
31、t;<p> 由于時(shí)間匆忙,我完成的課程設(shè)計(jì)還有很多不足之處,很多工作還可以繼續(xù)完善,在提交作業(yè)之后,我不會(huì)把它放在那里一看不看的,我會(huì)繼續(xù)完善它,讓它更加人性化,具有可操作性,比如做個(gè)可視化的界面出來,豐富它的功能,相信以后的工作將更加多彩豐富,更加有成就感!</p><p><b> 參考文獻(xiàn)</b></p><p> 陳火旺,劉春林,譚慶平,
32、趙克佳,劉越 程序設(shè)計(jì)語言編譯原理 國(guó)防工業(yè)出版社 2006</p><p> 譚浩強(qiáng) C++程序設(shè)計(jì) 清華大學(xué)出版社 2007</p><p><b> 附錄</b></p><p> 說明:本附錄中包含了本次課程設(shè)計(jì)的所有代碼</p><p> Closure_List.h</p>&
33、lt;p> #ifndef CLOSURE_LIST_H</p><p> #define CLOSURE_LIST_H</p><p> #include "Formula_List.h"</p><p> #include "LR0_Table.h"</p><p> struct
34、Item_Name_Type</p><p><b> {</b></p><p> int Formula_Num; </p><p> int Formula_Item; </p><p><b> };</b></p><p> struct Closur
35、e_Child_Node</p><p><b> {</b></p><p> Item_Name_Type Item_Name;</p><p> int Destination; </p><p> Closure_Child_Node *Next_Item;</p><
36、p><b> };</b></p><p> struct Closure_Parent_Node</p><p><b> {</b></p><p> int Current_State;</p><p> Closure_Parent_Node *Next_State;<
37、/p><p> Closure_Child_Node *Item;</p><p><b> };</b></p><p> class Closure_List</p><p><b> {</b></p><p><b> private:</b&g
38、t;</p><p> Closure_Parent_Node *Closure_List_head;</p><p> Closure_Parent_Node *GoToSet_Parent;</p><p> Closure_Parent_Node *Current_Parent;</p><p> Closure_Child_N
39、ode *GoToSet_Child;</p><p> Closure_Child_Node *Current_Child;</p><p> int AmountOf_State; </p><p> Formula_List sub_Formula_List;</p><p> LR0_Table sub_LR0_Table;
40、</p><p><b> public:</b></p><p> Closure_List():sub_Formula_List(),sub_LR0_Table()</p><p><b> {</b></p><p> Closure_List_head = NULL;</p&g
41、t;<p> GoToSet_Parent = NULL;</p><p> Current_Parent = NULL;</p><p> GoToSet_Child = NULL;</p><p> Current_Child = NULL;</p><p> AmountOf_State = 0;</p&g
42、t;<p> Create_Closure_List();</p><p><b> };</b></p><p> ~Closure_List();</p><p> void print_Closure_List();</p><p> void make_LR0_Table();</p
43、><p> void print_LR0_Table();</p><p> void Output_LR0_Table_ToFile();</p><p> bool Sentence_Analyse(const char Sentence[50]);</p><p><b> private:</b></p
44、><p> void Add_Clousure();</p><p> bool Add_GoToSet();</p><p> void Set_Initial_State();</p><p> void Create_Closure_List();</p><p> bool Is_Same_State_E
45、xist(const int Formula_Num,const int Formula_Item,int& Same_State_Num);</p><p> void Destroy_Closure_List();</p><p><b> };</b></p><p><b> #endif</b>&l
46、t;/p><p> Formula_List.h</p><p> #ifndef FORMULA_LIST_H</p><p> #define FORMULA_LIST_H</p><p> #include "Sign_List.h"</p><p> struct Formula_Li
47、st_ChildItem</p><p><b> {</b></p><p> int Sign_Name;</p><p> Formula_List_ChildItem* Next_Sign;</p><p><b> };</b></p><p> stru
48、ct Formula_List_ParentItem</p><p><b> {</b></p><p> int Formula_Num; </p><p> int Vn_Name; </p><p> int Formula_Length; </p><p>
49、; Formula_List_ParentItem* Next_Vn;</p><p> Formula_List_ChildItem* Formula;</p><p><b> };</b></p><p> class Formula_List</p><p><b> {</b>&
50、lt;/p><p><b> private:</b></p><p> Formula_List_ParentItem *Formula_List_head;</p><p> Formula_List_ChildItem *current_Formula_Item;</p><p> Formula_List_
51、ParentItem *current_VnNode;</p><p> Sign_List Sub_Sign_List; </p><p><b> public:</b></p><p> Formula_List():Sub_Sign_List()</p><p><b> {</b>
52、;</p><p> Formula_List_head = NULL;</p><p> current_Formula_Item = NULL;</p><p> current_VnNode = NULL;</p><p> Create_Formula_List();</p><p><b>
53、 };</b></p><p> ~Formula_List();</p><p> void print_Formula_List();</p><p> int int_check_Sign_Name(const char word);</p><p> char char_check_Sign_Name(const
54、 int Sign_Name);</p><p> int Get_Formula_Length(const int Formula_Num);</p><p> int Get_Sign_Name(const int Formula_Num, const int Item_Num);</p><p> int Get_Formula_LeftVn(const
55、 int Formula_Num);</p><p> bool Is_Sign_Name_Vn(const int Sign_Name);</p><p> int Get_AmountOf_Identity();</p><p><b> private:</b></p><p> void Destroy_
56、Formula_List();</p><p> void Create_Formula_List(); </p><p><b> };</b></p><p><b> #endif</b></p><p> LR0_Table.h</p><p> #if
57、ndef LR0_TABLE_H</p><p> #define LR0_TABLE_H</p><p> #include <iostream></p><p> #include <fstream></p><p> using namespace std;</p><p> #
58、include "ConstValue.h"</p><p> struct LR0_Table_Child</p><p><b> {</b></p><p> char Operation;</p><p> int Oprand;</p><p> bool
59、 Has_Been_Filled;</p><p> LR0_Table_Child *Next_Table_Child;</p><p><b> };</b></p><p> struct LR0_Table_Parent</p><p><b> {</b></p>&
60、lt;p> LR0_Table_Child *Table_Child;</p><p> LR0_Table_Parent *Next_Table_Parent;</p><p><b> };</b></p><p> class LR0_Table</p><p><b> {</b&
61、gt;</p><p><b> private:</b></p><p> LR0_Table_Parent *LR0_Table_head;</p><p> LR0_Table_Parent *Current_Parent;</p><p> LR0_Table_Child *Current_Child;&
62、lt;/p><p><b> public:</b></p><p> LR0_Table();</p><p> ~LR0_Table();</p><p> void initial(const int AmountOf_State, const int AmountOf_Identity);</p>
63、<p> bool Fill_In_Table(const int State_Num, const int Identity_Num,</p><p> const char char_Opration, const int int_Oprand);</p><p> void _OutputToFile();</p><p> void _
64、print_LR0_Table();</p><p> void Visit_LR0_Table(const int State_Num, const int Identity_Num, </p><p> char& char_Opration, int& int_Oprand);</p><p><b> private:<
65、/b></p><p> void Destroy_LR0_Table();</p><p><b> };</b></p><p><b> #endif</b></p><p> Sign_List.h</p><p> #ifndef SIGN_LIS
66、T_H</p><p> #define SIGN_LIST_H</p><p> #include <iostream></p><p> #include <fstream></p><p> using namespace std;</p><p> #include "
67、;ConstValue.h"</p><p> struct Sign_List_item</p><p><b> {</b></p><p> char Identity;</p><p> bool Is_Vn;</p><p> Sign_List_item *next
68、_Identity;</p><p><b> };</b></p><p> struct Identity_List_item</p><p><b> {</b></p><p> char Identity;</p><p> bool Is_Vn;<
69、/p><p><b> };</b></p><p> class Sign_List</p><p><b> {</b></p><p><b> private:</b></p><p> Identity_List_item *Ident
70、ity_List;</p><p> int AmountOf_Identity; </p><p><b> public:</b></p><p> Sign_List();</p><p> ~Sign_List();</p><p> void print_Id
71、entity_List();</p><p> int _int_check_Sign_Name(const char word);</p><p> char _char_check_Sign_Name(const int Sign_Name);</p><p> bool _Is_Sign_Name_Vn(const int Sign_Name);<
72、/p><p> int _Get_AmountOf_Identity();</p><p><b> private:</b></p><p> void Destroy_temp_Sign_List();</p><p> void Create_Identity_List();</p><p&
73、gt;<b> private:</b></p><p> Sign_List_item *current_Identity; </p><p> Sign_List_item *head; </p><p> bool Is_sameIdentity_Exist(const char word);<
74、;/p><p><b> };</b></p><p><b> #endif</b></p><p><b> Stack.h</b></p><p> #ifndef STACK_H</p><p> #define STACK_H</p
75、><p> struct elem</p><p><b> {</b></p><p><b> int data;</b></p><p> elem *next;</p><p><b> };</b></p><p>
76、; class Stack</p><p><b> {</b></p><p><b> private:</b></p><p> elem *top;</p><p> int count;</p><p><b> public:</b&g
77、t;</p><p><b> Stack();</b></p><p><b> ~Stack();</b></p><p> bool pushElem(const int Data);</p><p> bool getElem(int &Data);</p>&
78、lt;p> bool popElem();</p><p> int countElem()const;</p><p><b> };</b></p><p><b> #endif</b></p><p> Closure_List.cpp</p><p>
79、; #include "Closure_List.h"</p><p> #include "Stack.h"</p><p> bool Closure_List::Add_GoToSet()</p><p><b> {</b></p><p> int temp_
80、Formula_Length = </p><p> sub_Formula_List.Get_Formula_Length(GoToSet_Child->Item_Name.Formula_Num);</p><p> if (GoToSet_Child->Item_Name.Formula_Item <= temp_Formula_Length)</p>
81、;<p><b> {</b></p><p> int SameDestination = 0;</p><p> if (Is_Same_State_Exist(GoToSet_Child->Item_Name.Formula_Num,</p><p> GoToSet_Child->Item_Name.F
82、ormula_Item +1,SameDestination)==true)</p><p><b> {</b></p><p> GoToSet_Child->Destination = SameDestination;</p><p> return false;</p><p><b>
83、}</b></p><p> Closure_Child_Node *tempChild = new Closure_Child_Node;</p><p> tempChild->Item_Name.Formula_Num = GoToSet_Child->Item_Name.Formula_Num;</p><p> tempChi
84、ld->Item_Name.Formula_Item = GoToSet_Child->Item_Name.Formula_Item +1;</p><p> tempChild->Next_Item = NULL;</p><p> Current_Child = tempChild;</p><p> Closure_Parent_Nod
85、e *tempParent = new Closure_Parent_Node;</p><p> tempParent->Item = tempChild;</p><p> tempParent->Next_State = NULL;</p><p> tempParent->Current_State = Current_Parent-
86、>Current_State +1;</p><p> Current_Parent->Next_State = tempParent;</p><p> Current_Parent = tempParent;</p><p> GoToSet_Child->Destination = Current_Parent->Current_
87、State;</p><p> ++AmountOf_State;</p><p> return true;</p><p><b> }else</b></p><p><b> {</b></p><p> GoToSet_Child->Destinat
88、ion = -1;</p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p> void Closure_List::Add_Clousure()</p><p><b> {
89、</b></p><p> int temp_Sign_Name = </p><p> sub_Formula_List.Get_Sign_Name(GoToSet_Child->Item_Name.Formula_Num,</p><p> GoToSet_Child->Item_Name.Formula_Item +1);<
90、/p><p> if (temp_Sign_Name==-1)</p><p><b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p> if (sub_Formula_List
91、.Is_Sign_Name_Vn(temp_Sign_Name)==true)</p><p><b> {</b></p><p> int temp_Formula_Num = 1;</p><p> int temp_Vn_Name = 0;</p><p> while ((temp_Vn_Name =
92、sub_Formula_List.Get_Formula_LeftVn(temp_Formula_Num))!=-1)</p><p><b> {</b></p><p> if (temp_Sign_Name==temp_Vn_Name)</p><p><b> {</b></p><p&g
93、t; Closure_Child_Node *tempChild = new Closure_Child_Node;</p><p> tempChild ->Item_Name.Formula_Num = temp_Formula_Num;</p><p> tempChild ->Item_Name.Formula_Item = 1;</p><p
94、> tempChild->Next_Item = NULL;</p><p> Current_Child->Next_Item = tempChild;</p><p> Current_Child = tempChild;</p><p><b> }</b></p><p> ++tem
95、p_Formula_Num;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void Closure_List::Set_Initial_State()</p><
96、p><b> {</b></p><p> Closure_List_head = new Closure_Parent_Node;</p><p> Closure_List_head->Current_State = 0;</p><p> Closure_List_head->Item = NULL;</p
97、><p> Closure_List_head->Next_State = NULL;</p><p> GoToSet_Parent = Closure_List_head;</p><p> Current_Parent = Closure_List_head;</p><p> Closure_Child_Node *temp
98、Child = new Closure_Child_Node;</p><p> tempChild ->Item_Name.Formula_Num = 1;</p><p> tempChild ->Item_Name.Formula_Item = 1;</p><p> tempChild->Next_Item = NULL;</p
99、><p> Closure_List_head ->Item = tempChild;</p><p> GoToSet_Child = tempChild;</p><p> Current_Child = tempChild;</p><p> ++AmountOf_State;</p><p> in
100、t temp_Sign_Name = sub_Formula_List.Get_Sign_Name(1,1);</p><p> int temp_Formula_Num = 1;</p><p> int temp_Vn_Name = 0;</p><p> while ((temp_Vn_Name = sub_Formula_List.Get_Formul
101、a_LeftVn(temp_Formula_Num))!=-1)</p><p><b> {</b></p><p> if (temp_Sign_Name==temp_Vn_Name)</p><p><b> {</b></p><p> Closure_Child_Node *tem
102、pChild = new Closure_Child_Node;</p><p> tempChild ->Item_Name.Formula_Num = temp_Formula_Num;</p><p> tempChild ->Item_Name.Formula_Item = 1;</p><p> tempChild->Next_It
103、em = NULL;</p><p> Current_Child->Next_Item = tempChild;</p><p> Current_Child = tempChild;</p><p><b> }</b></p><p> ++temp_Formula_Num;</p>&
104、lt;p><b> }</b></p><p><b> }</b></p><p> void Closure_List::Create_Closure_List()</p><p><b> {</b></p><p> Set_Initial_State(
105、);</p><p> while (GoToSet_Parent!=NULL)</p><p><b> {</b></p><p> if (GoToSet_Child!=NULL)</p><p><b> {</b></p><p> if (Add_GoT
106、oSet()==true) </p><p><b> {</b></p><p> Add_Clousure(); </p><p><b> }</b></p><p> GoToSet_Child = GoToSet_Child->Next_Item; </p>
107、<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> GoToSet_Parent = GoToSet_Parent->Next_State;</p><p> if (G
108、oToSet_Parent==NULL)</p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b></p><p> GoToSet_Child = GoToSet_Parent->Item;<
109、;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void Closure_List::Destroy_Closure_List()</p><p><b>
110、 {</b></p><p> Current_Parent = Closure_List_head;</p><p> if (Closure_List_head == NULL)</p><p><b> {</b></p><p><b> return;</b><
111、/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> while (Current_Parent != NULL)</p><p><b> {</b
112、></p><p> Closure_Parent_Node *temp_ToDelete = Current_Parent;</p><p> Current_Child = Current_Parent->Item;</p><p> while (Current_Child != NULL)</p><p><b
113、> {</b></p><p> Closure_Child_Node *ToDelete = Current_Child;</p><p> Current_Child = Current_Child->Next_Item;</p><p> delete ToDelete;</p><p><b>
114、; }</b></p><p> Current_Parent = Current_Parent->Next_State;</p><p> delete temp_ToDelete;</p><p><b> }</b></p><p><b> }</b></
115、p><p> Closure_List_head = NULL;</p><p> GoToSet_Parent = NULL;</p><p> Current_Parent = NULL;</p><p> GoToSet_Child = NULL;</p><p> Current_Child = NULL
116、;</p><p><b> }</b></p><p> void Closure_List::print_Closure_List()</p><p><b> {</b></p><p> Closure_Parent_Node *print_Vn_Node = Closure_Lis
117、t_head;</p><p> if (Closure_List_head == NULL)</p><p><b> {</b></p><p><b> return;</b></p><p><b> }</b></p><p><
118、b> else</b></p><p><b> {</b></p><p> while (print_Vn_Node != NULL)</p><p><b> {</b></p><p> cout<<print_Vn_Node->Current_
119、State<<" : ";</p><p> Closure_Child_Node *pirnt_Item_Node = print_Vn_Node->Item;</p><p> while (pirnt_Item_Node != NULL)</p><p><b> {</b></p>
120、<p> cout<<'<'<<pirnt_Item_Node->Item_Name.Formula_Num<<','</p><p> <<pirnt_Item_Node->Item_Name.Formula_Item<<','</p><p>
121、 <<pirnt_Item_Node->Destination<<">, ";</p><p> pirnt_Item_Node = pirnt_Item_Node->Next_Item;</p><p><b> }</b></p><p> cout<<end
122、l;</p><p> print_Vn_Node = print_Vn_Node->Next_State;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
123、; bool Closure_List::Is_Same_State_Exist(const int Formula_Num,const int Formula_Item</p><p> ,int& Same_State_Num)</p><p><b> {</b></p><p> Closure_Parent_Node
124、*Check_Parent_Node = Closure_List_head;</p><p> while (Check_Parent_Node != NULL)</p><p><b> {</b></p><p> if (Check_Parent_Node->Item->Item_Name.Formula_Item =
125、= Formula_Item &&</p><p> Check_Parent_Node->Item->Item_Name.Formula_Num == Formula_Num)</p><p><b> {</b></p><p> Same_State_Num = Check_Parent_Node->
126、;Current_State;</p><p> return true;</p><p><b> }</b></p><p> Check_Parent_Node =Check_Parent_Node->Next_State;</p><p><b> }</b></p>
127、;<p> Same_State_Num = -1;</p><p> return false;</p><p><b> }</b></p><p> void Closure_List::make_LR0_Table()</p><p><b> {</b></p
128、><p> sub_LR0_Table.initial(AmountOf_State,sub_Formula_List.Get_AmountOf_Identity());</p><p> Closure_Parent_Node *Traverse_Parent = Closure_List_head;</p><p> Closure_Child_Node *T
129、raverse_Child = Closure_List_head->Item;</p><p> bool No_ErrorOccurIn_FillingTable = true;</p><p> while (Traverse_Parent!=NULL)</p><p><b> {</b></p><p&
130、gt; Item_Name_Type Traverse_Item;</p><p> Traverse_Item.Formula_Num = Traverse_Child->Item_Name.Formula_Num;</p><p> Traverse_Item.Formula_Item = Traverse_Child->Item_Name.Formula_Item;
131、</p><p> int CurrentFormulalength = </p><p> sub_Formula_List.Get_Formula_Length(Traverse_Item.Formula_Num);</p><p> if (Traverse_Item.Formula_Item<=CurrentFormulalength)</
132、p><p><b> {</b></p><p> int Traverse_Sign_Name = sub_Formula_List.Get_Sign_Name(Traverse_Item.Formula_Num,</p><p> Traverse_Item.Formula_Item);</p><p> int
133、 Goal_State_Num = Traverse_Child->Destination;</p><p> if (sub_Formula_List.Is_Sign_Name_Vn(Traverse_Sign_Name)==false)</p><p><b> {</b></p><p> No_ErrorOccurIn_Fi
溫馨提示
- 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ì)--構(gòu)造lr(0)分析法語法分析器
- 編譯原理課程設(shè)計(jì)-lr分析器總控程序的實(shí)現(xiàn)
- 課程設(shè)計(jì)詞法分析器
- 課程設(shè)計(jì)----編譯原理詞法分析器
- 實(shí)驗(yàn)4-lr(k)分析器
- 課程設(shè)計(jì)---生成lr分析表的算法實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)詞法分析器文檔
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)--語法分析器
- 編譯原理語法分析器課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--- 語法分析器
- 編譯原理課程設(shè)計(jì)---語法分析器
- 編譯原理詞法分析器語法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告之詞法分析器
- 編譯原理課程設(shè)計(jì)(c++)-語法分析器
- 編譯原理課程設(shè)計(jì)-詞法語法分析器
- 編譯原理課程設(shè)計(jì)---ll(1)遞歸下降分析器
- 語法分析課程設(shè)計(jì)---編譯原理語法分析器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--lr(1)分析和語義分析
- 編譯原理課程設(shè)計(jì)--lr(1)分析和語義分析
評(píng)論
0/150
提交評(píng)論