![LR(1)語法分析 - 副本_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/15f8d45d-f340-48ae-aa26-a29d9edca22e/15f8d45d-f340-48ae-aa26-a29d9edca22e1.gif)
![LR(1)語法分析 - 副本_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/15f8d45d-f340-48ae-aa26-a29d9edca22e/15f8d45d-f340-48ae-aa26-a29d9edca22e2.gif)
![LR(1)語法分析 - 副本_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/15f8d45d-f340-48ae-aa26-a29d9edca22e/15f8d45d-f340-48ae-aa26-a29d9edca22e3.gif)
![LR(1)語法分析 - 副本_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/15f8d45d-f340-48ae-aa26-a29d9edca22e/15f8d45d-f340-48ae-aa26-a29d9edca22e4.gif)
![LR(1)語法分析 - 副本_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/15f8d45d-f340-48ae-aa26-a29d9edca22e/15f8d45d-f340-48ae-aa26-a29d9edca22e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理課程設(shè)計(jì)報(bào)告編 譯 原 理課程設(shè)計(jì)實(shí)驗(yàn)名稱:構(gòu)造LR(0)分析法語法分析器姓 名:魏鑫班 級(jí):四班學(xué) 號(hào):20130905416 指導(dǎo)老師:吳海霞2016年 12 月 16 日1目錄一 課題綜述111 課題來源112 意義113 預(yù)期目標(biāo)214 面對(duì)的問題21. 5 需解決的關(guān)鍵技術(shù)3二 系統(tǒng)分析321 涉及的基礎(chǔ)知識(shí)32. 2解決問題的基本思路523 總體方案524 功能模塊框圖5三 系統(tǒng)設(shè)計(jì)631 算法描述63. 2 實(shí)現(xiàn)方法733 詳細(xì)流程圖9四 代碼編寫1041 主要模塊的代碼分析10五 程序調(diào)試16六 運(yùn)行與調(diào)試16參考文獻(xiàn)20一 課題綜述11 課題來源編譯器設(shè)計(jì)的編譯程序涉
2、及到編譯五個(gè)階段中的三個(gè),即詞法分析器、語法分析器和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、狀態(tài)棧分析過程顯示及四元式序列程序。整個(gè)編譯程序分為三部分:詞法分析部分、語法分析處理及四元式生成部分、輸出顯示部分。一個(gè)程序設(shè)計(jì)語言就是一個(gè)記號(hào)系統(tǒng),如同自然語言一樣,它的完整的定義應(yīng)包括語法和語義兩個(gè)方面。所謂一個(gè)語言的語法是指一組規(guī)則,用它可以形成和產(chǎn)生一個(gè)合適的程序。目前廣泛使用的手段是上下文無關(guān)文法,即用上下文無關(guān)文法作為程序設(shè)計(jì)語言語法的描述工具。自底向上分析方法是一種移進(jìn)-規(guī)約過程,當(dāng)分析的棧頂符號(hào)串形成句柄時(shí)就采取歸約動(dòng)作,因而自底向上分析法的關(guān)鍵問題是在
3、分析過程中如何確定句柄。LR分析法正是給出一種能根據(jù)當(dāng)前分析棧中的符號(hào)串(通常以狀態(tài)表示)和向右順序查看輸人串的k個(gè)(k>=0)符號(hào)就可惟一地確定分析器的動(dòng)作是移進(jìn)還是歸約和用哪個(gè)產(chǎn)生式歸約,因而也就能惟一地確定句柄。LR分析法的歸約過程是規(guī)范推導(dǎo)的逆過程,所以LR分析過程是一種規(guī)范歸約過程。12 意義 LR(0)分析方法雖然對(duì)文法的限制比較大,對(duì)絕大多數(shù)高級(jí)語言的語法分析器不能適用,然而他是構(gòu)造其他LR類分析器的基礎(chǔ),學(xué)習(xí)和掌握LR(0)分析的原理和方法是我們掌握更高級(jí)語言語法分析的基礎(chǔ)。歸納起來,大體上可分為兩大類,即自頂向下分析方法和自底向上分析方法。自底向上分析方法是一種移進(jìn)-規(guī)
4、約過程,當(dāng)分析的棧頂符號(hào)串形成句柄時(shí)就采取歸約動(dòng)作,因而自底向上分析法的關(guān)鍵問題是在分析過程中如何確定句柄。LR分析法正是給出一種能根據(jù)當(dāng)前分析棧中的符號(hào)串(通常以狀態(tài)表示)和向右順序查看輸人串的k個(gè)(k>=0)符號(hào)就可惟一地確定分析器的動(dòng)作是移進(jìn)還是歸約和用哪個(gè)產(chǎn)生式歸約,因而也就能惟一地確定句柄。LR分析法的歸約過程是規(guī)范推導(dǎo)的逆過程,所以LR分析過程是一種規(guī)范歸約過程。13 預(yù)期目標(biāo)本次課程設(shè)計(jì)的目標(biāo)即是利用所學(xué)過的編譯原理的知識(shí),利用LR(0)分析法,用C語言寫出一個(gè)簡(jiǎn)單的LR(0)語法分析器。該語法分析器所要完成的功能是,對(duì)錄入的文法判斷它是否為L(zhǎng)R(0)文法,如果是輸出LR&
5、#160;(0)分析表;在給定文法的情況下,能夠利用LR(0)分析表,對(duì)用戶輸入的一串字符串用LR(0)分析法進(jìn)行分析,判斷該字符串是否為符合給定文法的一個(gè)句子,建立文法及其LR分析表表示的數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)并實(shí)現(xiàn)一個(gè)LR(0)的分析器。14 面對(duì)的問題(1)分析表的構(gòu)造。(2)歸約還是移進(jìn)的判斷。(3)接受acc的判斷。(4)編程結(jié)果的輸出。在本次課程設(shè)計(jì)中,主要的是面對(duì)的文法的確定,以及分析其工作過程如何進(jìn)行。對(duì)于文法確定的問題,必須找到一個(gè)符合LR(0)規(guī)范的文法,并且該文法不易太復(fù)雜,否則對(duì)于初次編寫語法分析器的我們來說會(huì)比較復(fù)雜,否則容易出錯(cuò)。第二個(gè)就是分析過程的問題,目前,我們只是了解
6、了理論上LR(0)的分析過程,但如何將該過程用程序去實(shí)現(xiàn),并且能夠?qū)σ粋€(gè)輸入串進(jìn)行實(shí)時(shí)的分析是比較復(fù)雜的。這涉及到對(duì)一個(gè)字符串進(jìn)行一個(gè)字符一個(gè)字符的讀取和操作,并且還要對(duì)幾個(gè)連在一起的字符進(jìn)行合并等操作,要求比較的高,對(duì)我們而言比較困難。在規(guī)范規(guī)約的過程中,一方面記住已移進(jìn)和規(guī)約出的整個(gè)符號(hào)串,另一方面根據(jù)所用的產(chǎn)生式推測(cè)未來可能碰到的輸入符號(hào)。當(dāng)一串句柄的符號(hào)串呈現(xiàn)于分析棧的頂端時(shí),希望能夠根據(jù)上面過程中的數(shù)據(jù)來確定棧頂?shù)姆?hào)串是否構(gòu)成相對(duì)某一產(chǎn)生式的句柄。能正確初始化狀態(tài)棧,對(duì)棧內(nèi)元素的進(jìn)棧和出棧,取棧頂元素以及遍歷棧元素,LR分析方法是一種自底向上的分析方法,是一種個(gè)移進(jìn)-歸約的過程。當(dāng)
7、分析的棧頂符號(hào)串形成句柄時(shí)就采取歸約動(dòng)作,因而自底向上分析法的關(guān)鍵問題是在分析過程忠如何確定句柄。LR(0)分析器是在分析過程中不需要察看輸入符號(hào),因而它對(duì)文法的限制較大,對(duì)絕大多數(shù)高級(jí)語言的語法分析器是不能使用的,然而,他是構(gòu)造其他LR類分析器的基礎(chǔ)。1. 5 需解決的關(guān)鍵技術(shù)(1)詞法編譯器。(2)交互式面向?qū)ο蟮脑~法編譯器基本功能是。(3)根據(jù)規(guī)約規(guī)則對(duì)字符進(jìn)行歸約。(4)符合條件時(shí)采取移進(jìn)動(dòng)作。二 系統(tǒng)分析21 涉及的基礎(chǔ)知識(shí)2.1.1 詞法編譯器功能(1)導(dǎo)入任意文法,也可以自己輸入。(2)輸出文法的分析過程,以及判斷是否為L(zhǎng)R (0)文法,輸出分析表。(3)輸入句子,進(jìn)行
8、語法分析。(4)輸出結(jié)構(gòu)樹。2.1.2 詞法分析器的設(shè)計(jì)方法有如下四個(gè)步驟:(1)寫出該語言的詞法規(guī)則。(2)把詞法規(guī)則轉(zhuǎn)換為相應(yīng)的狀態(tài)轉(zhuǎn)換圖。(3)把各轉(zhuǎn)換圖的初態(tài)連在一起,構(gòu)成識(shí)別該語言的自動(dòng)機(jī)。(4)設(shè)計(jì)掃描器;把掃描器作為語法分析的一個(gè)過程,當(dāng)語法分析需要一個(gè)單詞時(shí),就調(diào)用掃描器。掃描器從初態(tài)出發(fā),當(dāng)識(shí)別一個(gè)單詞后便進(jìn)入終態(tài),送出二元式。2.1.3 動(dòng)態(tài)模擬算法的基本功能(1)輸入LR分析表和一個(gè)句子。(2)輸出LR總控程序。(3)輸出依據(jù)句子構(gòu)對(duì)應(yīng)的語法樹的過程。(4)設(shè)計(jì)一個(gè)給定LR分析表,輸入一個(gè)句子,能由依據(jù)LR分析表輸出與句子對(duì)應(yīng)的語法樹,能對(duì)語法樹生成過程進(jìn)行模擬。 表 2
9、-1 LR分析表STATEACTIONGOTOabcd#ETF0S2S311acc2S4S1063S5S474S4S1085S5S1196r1r1r1r1r17r2r2r2r2r28r3r3r3r3r39r5r5r5r5r510r4r4r4r4r411r6r6r6r6r6(5)輸入句子:bccd#。(6)根據(jù)文法產(chǎn)生的LR分析表。(7)輸出結(jié)果2.1.4 LR分析器的構(gòu)成一個(gè)LR分析器由個(gè)部分組成(1)總控程序,也可以稱為驅(qū)動(dòng)程序。對(duì)所有的LR分析器,總控程序都是相同的。(2)分析表或分析函數(shù)。不同的文法分析表將不同,同一個(gè)文法采用的LR分析器不同時(shí),分析表也不同,分析表又可以分為動(dòng)作(ACT
10、ION)表和狀態(tài)轉(zhuǎn)換(GOTO)表兩個(gè)部分,它們都可用二維數(shù)組表示。(3)分析棧,包括文法符號(hào)和相應(yīng)的狀態(tài)棧。它們均是先進(jìn)后出棧。分析器的動(dòng)作由棧頂狀態(tài)和當(dāng)前輸入符號(hào)所決定(LR(0)分析器不需向前查看輸入符號(hào))。2. 2解決問題的基本思路1、用構(gòu)造一個(gè)狀態(tài)轉(zhuǎn)換函數(shù)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換。2、再通過函數(shù)構(gòu)造一個(gè)移進(jìn)歸約函數(shù)實(shí)現(xiàn)移進(jìn)規(guī)約動(dòng)作。3、采用構(gòu)造一個(gè)打印LR分析器的工作過程函數(shù)實(shí)現(xiàn)輸出。在規(guī)范規(guī)約的過程中,一方面記住已移進(jìn)和規(guī)約出的整個(gè)符號(hào)串,另一方面根據(jù)所用的產(chǎn)生式推測(cè)可能碰到的輸入符號(hào)。每一項(xiàng)ACTION(s,a)所規(guī)定的動(dòng)作不外是下述四種可能之一:(1)移進(jìn):把(s,a)的下一個(gè)轉(zhuǎn)態(tài)s =
11、GOTO(s,X)和輸入符號(hào)a推進(jìn)棧,下一輸入符號(hào)變成現(xiàn)行輸入符號(hào)。(2)規(guī)約:指用某一產(chǎn)生式A 進(jìn)行規(guī)約。假若的長(zhǎng)度為r,規(guī)約的動(dòng)作是A,去除棧頂?shù)膔個(gè)項(xiàng),使?fàn)顟B(tài)Sm-r 變成棧頂狀態(tài),然后把(Sm-r,A)的下一狀態(tài)s = GOTO(Sm-r,A)和文法符號(hào)A推進(jìn)棧。規(guī)約動(dòng)作不改變現(xiàn)行輸入符號(hào)。執(zhí)行規(guī)約動(dòng)作意味著(= Xm-r+1Xm)已呈現(xiàn)于棧頂而且是一個(gè)相對(duì)于A的句柄。(3)接受:宣布分析成功,停止分析器的工作。(4)報(bào)錯(cuò):發(fā)現(xiàn)源程序含有錯(cuò)誤,調(diào)用出錯(cuò)處理程序。23 總體方案本課題是由一個(gè)四人的團(tuán)隊(duì)去完成的,所以,每個(gè)小組成員分配了不同的工作共同完成這個(gè)項(xiàng)目。24 功能模塊框圖運(yùn)行程序
12、給出該程序所運(yùn)用的文法和LR分析表用戶輸入字符串程序給出結(jié)果圖2.2功能模塊框圖三 系統(tǒng)設(shè)計(jì) 31 算法描述1、已知文法G(1) EE+T(2) ET(3) TT*F(4) TF(5) F(E)(6) Fi2、LR(0)分析表的構(gòu)造算法如下:假設(shè)已構(gòu)造出LR(0)項(xiàng)目集規(guī)范族為:C=I0,I1, , In其中Ik為項(xiàng)目集的名字,k為狀態(tài)名,令包含S·S項(xiàng)目的集合Ik的下標(biāo)k為分析器的初始狀態(tài)。那么分析表的ACTION表和GOTO表構(gòu)造步驟為:(1) 若項(xiàng)目A·a屬于Ik且轉(zhuǎn)換函數(shù)GO(Ik,a)= Ij,當(dāng)a為終結(jié)符時(shí)則置ACTIONk,a為Sj,其動(dòng)作含意為將終結(jié)符a移進(jìn)
13、符號(hào)棧,狀態(tài)j進(jìn)入狀態(tài)棧,(相當(dāng)狀態(tài)k時(shí)遇a轉(zhuǎn)向狀態(tài)j)。(2) 若項(xiàng)目A· 屬于Ik,則對(duì)任何終結(jié)符a 和'#'號(hào)置ACTIONk,a和ACTIONk,#為"rj",j為在文法G中某產(chǎn)生式A的序號(hào)。rj動(dòng)作的含義是把當(dāng)前文法符號(hào)棧頂?shù)姆?hào)串歸約為A,并狀態(tài)棧指針從棧頂向下移動(dòng)|的長(zhǎng)度 , 文法符號(hào)棧從棧頂彈出|個(gè)符號(hào),非終結(jié)符A變?yōu)楫?dāng)前面臨的符號(hào)。(3) 若GO(Ik,A)Ij,則置GOTOk,A為"j",其中A為非終結(jié)符,表示當(dāng)前狀態(tài)為"k"時(shí),遇文法符號(hào)A時(shí)狀態(tài)應(yīng)轉(zhuǎn)向j,因此A移入文法符號(hào)棧,j移入狀態(tài)
14、棧。(4) 若項(xiàng)目SS·屬于Ik,則置ACTIONk,#為"acc",表示接受。(5) 凡不能用上述方法填入的分析表的元素,均應(yīng)填上"報(bào)錯(cuò)標(biāo)志"。為了表的清晰我們僅用空白表示錯(cuò)誤標(biāo)志。根據(jù)這種方法構(gòu)造的LR(0)分析表不含多重定義時(shí),稱這樣的分析表為L(zhǎng)R(0)分析表,能用LR(0)分析表的分析器稱為L(zhǎng)R(0)分析器,能構(gòu)造LR(0)分析表的文法稱為L(zhǎng)R(0)文法。3、產(chǎn)生如圖2-1所示的LR分析表這張分析表包括兩個(gè)部分,一是“動(dòng)作”(ACTION)表,另一是“狀態(tài)轉(zhuǎn)換”(GOTO)表。ACTION(S,a)規(guī)定了當(dāng)狀態(tài)S面臨輸入符號(hào)a時(shí)應(yīng)采取什
15、么動(dòng)作。GOTO(S,X)規(guī)定了狀態(tài)S面對(duì)文法符號(hào)X(終結(jié)符或非終結(jié)符)時(shí)下一狀態(tài)是什么。顯然,GOTO(S,X)定義了一個(gè)以文法符號(hào)為字母表的DFA。每一項(xiàng)ACTION(S,a)所規(guī)定的動(dòng)作不外是下述四種可能之一:(1)移進(jìn)把(S,a)的下一個(gè)轉(zhuǎn)態(tài)S=GOTO(S,X)和輸入符號(hào)a推進(jìn)棧,下一輸入符號(hào)變成現(xiàn)行輸入符號(hào)。(2)規(guī)約指用某一產(chǎn)生式A進(jìn)行規(guī)約。假若的長(zhǎng)度為r,規(guī)約的動(dòng)作是A,去除棧頂?shù)膔個(gè)項(xiàng),使?fàn)顟B(tài)Sm-r變成棧頂狀態(tài),然后把(Sm-r,A)的下一狀態(tài)S=GOTO(Sm-r,A)和文法符號(hào)A推進(jìn)棧。規(guī)約動(dòng)作不改變現(xiàn)行輸入符號(hào)。執(zhí)行規(guī)約動(dòng)作意味著(=Xm-r+1Xm)已呈現(xiàn)于棧頂而且
16、是一個(gè)相對(duì)于A的句柄。(3)接受宣布分析成功,停止分析器的工作。(4)報(bào)錯(cuò)發(fā)現(xiàn)源程序含有錯(cuò)誤,調(diào)用出錯(cuò)處理程序。一個(gè)LR分析器的工作過程可看成是棧里的狀態(tài)序列,已規(guī)約串和輸入串所構(gòu)成的三元式的變化過程。分析開始時(shí)的初始三元式為:(S0, #, a1a2an#)。 其中,S0為分析器的初態(tài);為句子的左括號(hào);a1a2an為輸入串;其后的為結(jié)束符(句子右括號(hào))。分析過程每步的結(jié)果可表示為:(S0S1Sm,#X1X2Xm ai, ai+1an#)。3. 2 實(shí)現(xiàn)方法3.2.1 構(gòu)造分析表LR分析器實(shí)質(zhì)上是一個(gè)帶先進(jìn)后出存儲(chǔ)器(棧)的確定有限狀態(tài)自動(dòng)機(jī)。LR分析器的每一步工作是由棧頂狀態(tài)和現(xiàn)行輸入符號(hào)所
17、唯一決定的。構(gòu)造一個(gè)int型二維數(shù)組table139,用于存放LR分析表。并初始化。作者這樣規(guī)定:011 表示 狀態(tài)Sj,其中0對(duì)應(yīng)S0,1對(duì)應(yīng)S12126 表示 規(guī)約Rj,其中21對(duì)應(yīng)R1,22對(duì)應(yīng)R212 表示 “接受”。-1 表示 規(guī)約出錯(cuò),報(bào)錯(cuò)。3.2.2程序設(shè)計(jì)關(guān)鍵(1)在輸入串(句子)輸入的過程中,涉及到一個(gè)壓棧的問題。但是輸入串壓入的字符順序剛好與原理中的字符串模型剛好相反,這樣需要先彈出的反而在棧底。為了既要保證字符串輸入,又要讓輸入的字符串存儲(chǔ)順序與輸入的字符串相反。采取以下措施:先將輸入的字符串壓入符號(hào)棧symbol中,然后符號(hào)棧彈出的字符再壓入輸入串棧instr中,這樣實(shí)
18、現(xiàn)了輸入串的倒序存儲(chǔ)。(2)狀態(tài)棧和符號(hào)棧輸出(遍歷)過程均采取自棧底到棧頂?shù)捻樞?,而輸入串棧則是采取自棧頂?shù)綏5椎捻樞蜉敵觥?.2.3 LR(0)項(xiàng)目集規(guī)范族的構(gòu)造識(shí)別活前輟的NFA我們可以利用子集法將其確定化。對(duì)確定化后的DFA如果把每個(gè)子集中所含狀態(tài)集對(duì)應(yīng)的項(xiàng)目寫在新的狀態(tài)中。對(duì)于構(gòu)成識(shí)別一個(gè)文法活前綴的DFA項(xiàng)目集(狀態(tài))的全體稱為這個(gè)文法的LR(0)項(xiàng)目集規(guī)范族,我們可以分析每個(gè)狀態(tài)中項(xiàng)目集的構(gòu)成,不難發(fā)現(xiàn)如下規(guī)律:若狀態(tài)中包含形如A·B的項(xiàng)目,則形如B·的項(xiàng)目也在此狀態(tài)內(nèi)。例如:0狀態(tài)中項(xiàng)目集為S·E,E·aA, E·bB。回顧由N
19、FA確定化到DFA時(shí),E·aA和E·bB正是屬于S·E的閉包中。因而,可引入閉包函數(shù)(CLOSURE)來求DFA一個(gè)狀態(tài)的項(xiàng)目集。若文法G已拓廣為G,而S為文法G的開始符號(hào),拓廣后增加產(chǎn)生式SS。如果I是文法G的一個(gè)項(xiàng)目集,定義和構(gòu)造I的閉包CLOSURE(I)如下:(1) I的項(xiàng)目均在CLOSURE(I)中。(2) 若A·B屬于CLOSURE(I),則每一形如B·的項(xiàng)目也屬于CLOSURE(I)。(3) 重復(fù)(2)直到不出現(xiàn)新的項(xiàng)目為止。即CLOSURE(I)不再擴(kuò)大。由此,我們可以很容易構(gòu)造出初態(tài)的閉包,即S·S屬于I,再按上述三
20、點(diǎn)求其閉包。回顧在構(gòu)造識(shí)別活前綴的NFA時(shí),其兩個(gè)相鄰狀態(tài)對(duì)應(yīng)的項(xiàng)目是出自同一個(gè)產(chǎn)生式,只是圓點(diǎn)的位置相差1,箭弧上的標(biāo)記為前一個(gè)狀態(tài)和后一個(gè)狀態(tài)對(duì)應(yīng)項(xiàng)目圓點(diǎn)間的符號(hào),(除了箭弧上標(biāo)記為的外)。由于識(shí)別活前綴的DFA的每個(gè)狀態(tài)是一個(gè)項(xiàng)目集,項(xiàng)目集中的每個(gè)項(xiàng)目都不相同,每個(gè)項(xiàng)目圓點(diǎn)后的符號(hào)不一定相同,因而對(duì)每個(gè)項(xiàng)目圓點(diǎn)移動(dòng)一個(gè)位置后,箭弧上的標(biāo)記也不會(huì)完全相同,這樣,對(duì)于不同的標(biāo)記將轉(zhuǎn)向不同的狀態(tài)。例如初態(tài)S·E,E·aA,E·bB對(duì)第一個(gè)項(xiàng)目圓點(diǎn)右移一個(gè)位置后變?yōu)镾E·箭弧標(biāo)記應(yīng)為E,對(duì)第二個(gè)項(xiàng)目E·aA,圓點(diǎn)右移一個(gè)位置后,項(xiàng)目變?yōu)镋a
21、83;A,箭弧標(biāo)記為a,同樣第三個(gè)項(xiàng)目為圓點(diǎn)右移一個(gè)位置后變?yōu)镋b·B,箭弧標(biāo)記為b,顯然,初態(tài)可發(fā)出三個(gè)不同標(biāo)記的箭弧,因而轉(zhuǎn)向三個(gè)不同的狀態(tài),也就由初態(tài)派生出三個(gè)新的狀態(tài),對(duì)于每個(gè)新的狀態(tài)我們又可以利用前面的方法,若圓點(diǎn)后為非終結(jié)符則可對(duì)其求閉包,得到該狀態(tài)的項(xiàng)目集。圓點(diǎn)后面為終結(jié)符或在一個(gè)產(chǎn)生式的最后,則不會(huì)再增加新的項(xiàng)目。初始化狀態(tài)棧,符號(hào)棧,輸入串棧輸入串各字符壓棧 求下一狀態(tài)符號(hào)ii = goto_char(status_p,instr_p)規(guī)約出錯(cuò)!異常中止!i = = -1 ?規(guī)約成功!退出i = = 12 ?規(guī)約動(dòng)作:1 求出i對(duì)應(yīng)規(guī)約規(guī)則右部字符串長(zhǎng)度x = ri
22、-21.y2 在符號(hào)棧和狀態(tài)棧中彈出x個(gè)字符。然后將該規(guī)約規(guī)則左部壓入輸入串棧i>0 && i<=11 移進(jìn)動(dòng)作:1 將現(xiàn)狀態(tài)i壓棧push(status_p,i)2 將當(dāng)前輸入串字符壓入符號(hào)棧a = pop(instr_p)push(symbol_p,a)打印該步工作過程33 詳細(xì)流程圖 圖3.2 LR分析器設(shè)計(jì)流程圖四 代碼編寫41 主要模塊的代碼分析4.1.1 生成分析表代碼void CLR0ForWinDlg:OnGtable() CTableDlg dlg;dlg.SetControlInfo(IDC_EXPLORER1, RESIZE_BOTH);dlg
23、.SetControlInfo(IDOK, ANCHORE_BOTTOM | ANCHORE_RIGHT);dlg.SetControlInfo(IDC_EXPORT, ANCHORE_BOTTOM | ANCHORE_RIGHT);dlg.SetControlInfo(IDC_ANALYZE, ANCHORE_BOTTOM | ANCHORE_RIGHT);string temp = ""CString t;for(int i = 0; i < m_vtlist.GetCount(); i+)m_vtlist.GetText(i,t);/temp.push_back
24、(t.GetAt(0);temp += t.GetAt(0);dlg.g.SetVt(temp);temp = ""for(i = 0; i < m_vnlist.GetCount(); i+)m_vnlist.GetText(i,t);/temp.push_back(t.GetAt(0);temp += t.GetAt(0);dlg.g.SetVn(temp);m_startedit.GetWindowText(t);if (t = "")MessageBox("輸入的文法有誤,請(qǐng)檢查!", "錯(cuò)誤",MB
25、_OK | MB_ICONSTOP);return;dlg.g.SetStart(t.GetAt(0);temp = ""for(i = 0; i < m_plist.GetCount(); i+)temp = ""m_plist.GetText(i,t);for(int j = 0; j < t.GetLength(); j +)/temp.push_back(t.GetAt(j);temp += t.GetAt(j);dlg.g.AddPrecept(temp);if(dlg.g.IsGrammarLegal()dlg.g.Generat
26、eLR0Table();dlg.DoModal();elseMessageBox("輸入的文法有誤,請(qǐng)檢查!", "錯(cuò)誤",MB_OK | MB_ICONSTOP);4.1.2分析句子代碼void CAnalyzeDlg:OnButton1() / TODO: Add your control notification handler code hereUpdateData(TRUE);m_pTree->m_tree.DeleteAllItems();for(int i = 0; i < m_input.GetLength(); i +)if
27、 (!m_g.IsInVt(m_input.GetAt(i)MessageBox("輸入的句子不全部由終結(jié)符組成", "錯(cuò)誤", MB_OK | MB_ICONSTOP);return;assert(TreeStack.empty();m_input += "#"char szTempPathMAX_PATH; char szTempNameMAX_PATH; if (m_strTempFilename != ""):DeleteFile(m_strTempFilename.c_str();:GetTempPath
28、(100,szTempPath);:GetTempFileName(szTempPath,"LR0",0,szTempName);m_strTempFilename = szTempName;CStdioFile out;out.Open(szTempName, CFile:modeCreate | CFile:modeWrite);out.WriteString("<html>n");out.WriteString("<head>n");out.WriteString("<title>U
29、ntitled Document</title>n");out.WriteString("<meta http-equiv="Content-Type" content="text/html; charset=gb2312">n");out.WriteString("</head>n");out.WriteString("<body bgcolor="#FFFFFF" text="#000000">n&quo
30、t;);out.WriteString("<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">n");out.WriteString("<tr>n<td nowrap> 步驟 </td>n<td nowrap>&a
31、mp;nbsp;狀態(tài)棧</td>n<td nowrap> 符號(hào)棧 </td>n<td nowrap> 輸入串 </td>n<td nowrap> ACTION </td>n<td nowrap > GOTO </td>n </tr>n");vector <int> Status;vector <char&g
32、t; Symbol;int iStep = 1;int iPos = 0;Status.push_back(0);Symbol.push_back('#');Pair ToDo;bool bErrorFlag = false;bool bGoOn = true;while (bGoOn) && (!bErrorFlag)assert(iPos < m_input.GetLength();assert(Status.size() = Symbol.size();ToDo = m_g.GetAction(Status.back(), m_input.GetAt
33、(iPos);int i, j;switch (ToDo.one)case 'S':out.WriteString(GetStepInfo(iStep, Status, Symbol, m_input.Right(m_input.GetLength() - iPos), ToDo, -1);Symbol.push_back(m_input.GetAt(iPos);Status.push_back(ToDo.two);iPos+;break;case 'R':j = m_g.GetGoTo(StatusStatus.size()-m_g.GetPrecept(To
34、Do.two).GetRight().length()-1, m_g.GetPrecept(ToDo.two).GetLeft()0);assert(j != -1);out.WriteString(GetStepInfo(iStep, Status, Symbol, m_input.Right(m_input.GetLength() - iPos), ToDo, j);for(i = 0; i < m_g.GetPrecept(ToDo.two).GetRight().length(); i+)Status.pop_back();Symbol.pop_back();Symbol.pus
35、h_back(m_g.GetPrecept(ToDo.two).GetLeft()0);Status.push_back(j);TreeStack.push(ToDo.two);break;case 'a':if (m_input.GetAt(iPos) = '#')out.WriteString(GetStepInfo(iStep, Status, Symbol, m_input.Right(m_input.GetLength() - iPos), ToDo, -1);bGoOn = false;elsebErrorFlag = true;break;case
36、 0:bErrorFlag = true;break;default:assert(false);iStep+;out.WriteString("</table>");if (bErrorFlag)out.WriteString("<p><font color="#FF3300">分析失敗,輸入的字符串是不符合預(yù)定文法的!</font></p>n");/m_pTree->m_tree.DeleteAllItems();while(!TreeStack.empty()TreeStack.pop();elseout.WriteString("<p><font color="#009900">分析完成,輸入的字符串是預(yù)定文法的句子</font></p>n");/HTREEITEM h = m_pTree->m_tree.GetRootItem();/ExpandTree(h);Mak
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度環(huán)保材料印刷委托協(xié)議范本3篇
- 2025版牙齒矯正教育培訓(xùn)機(jī)構(gòu)合作合同3篇
- 二零二五年度個(gè)人掛靠公司教育培訓(xùn)合作協(xié)議3篇
- 二零二五版私人學(xué)校物業(yè)設(shè)施租賃及管理合同3篇
- 機(jī)械設(shè)備行業(yè)員工需求
- 服裝行業(yè)生產(chǎn)工藝安全
- 藥學(xué)科護(hù)士協(xié)助藥劑配制
- 二零二五年度個(gè)人股權(quán)轉(zhuǎn)讓代持協(xié)議書(股權(quán)代持與退出機(jī)制)16篇
- 二零二五年度行政合同訂立流程與模板指南3篇
- 二零二五年度婚禮視頻拍攝制作合同2篇
- 課題申報(bào)書:數(shù)智賦能高職院校思想政治理論課“金課”實(shí)踐路徑研究
- H3CNE認(rèn)證考試題庫官網(wǎng)2022版
- 感統(tǒng)訓(xùn)練培訓(xùn)手冊(cè)(適合3-13歲兒童)
- ??停?024年智能制造校園招聘白皮書
- 海員的營(yíng)養(yǎng)-1315醫(yī)學(xué)營(yíng)養(yǎng)霍建穎等講解
- 2023年廣東省招聘事業(yè)單位人員考試真題及答案
- 幼兒平衡車訓(xùn)練課程設(shè)計(jì)
- 梁山伯與祝英臺(tái)小提琴譜樂譜
- 我國全科醫(yī)生培訓(xùn)模式
- DBJ51-T 188-2022 預(yù)拌流態(tài)固化土工程應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 《長(zhǎng)津湖》電影賞析PPT
評(píng)論
0/150
提交評(píng)論