LR1語法分析副本_第1頁
LR1語法分析副本_第2頁
LR1語法分析副本_第3頁
LR1語法分析副本_第4頁
LR1語法分析副本_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、編 譯 原 理課程設(shè)計實(shí)驗(yàn)名稱:構(gòu)造LR(0)分析法語法分析器姓 名:魏鑫班 級:四班學(xué) 號:20130905416 指導(dǎo)老師:吳海霞2016年 12 月 16 日目錄一 課題綜述111 課題來源112 意義113 預(yù)期目標(biāo)214 面對的問題21. 5 需解決的關(guān)鍵技術(shù)3二 系統(tǒng)分析321 涉及的基礎(chǔ)知識32. 2解決問題的基本思路523 總體方案524 功能模塊框圖5三 系統(tǒng)設(shè)計631 算法描述63. 2 實(shí)現(xiàn)方法733 詳細(xì)流程圖9四 代碼編寫1041 主要模塊的代碼分析10五 程序調(diào)試16六 運(yùn)行與調(diào)試16參考文獻(xiàn)20一 課題綜述11 課題來源編譯器設(shè)計的編譯程序涉及到編譯五個階段中的三

2、個,即詞法分析器、語法分析器和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、狀態(tài)棧分析過程顯示及四元式序列程序。整個編譯程序分為三部分:詞法分析部分、語法分析處理及四元式生成部分、輸出顯示部分。一個程序設(shè)計語言就是一個記號系統(tǒng),如同自然語言一樣,它的完整的定義應(yīng)包括語法和語義兩個方面。所謂一個語言的語法是指一組規(guī)則,用它可以形成和產(chǎn)生一個合適的程序。目前廣泛使用的手段是上下文無關(guān)文法,即用上下文無關(guān)文法作為程序設(shè)計語言語法的描述工具。自底向上分析方法是一種移進(jìn)-規(guī)約過程,當(dāng)分析的棧頂符號串形成句柄時就采取歸約動作,因而自底向上分析法的關(guān)鍵問題是在分析過程中如何確定句柄

3、。LR分析法正是給出一種能根據(jù)當(dāng)前分析棧中的符號串(通常以狀態(tài)表示)和向右順序查看輸人串的k個(k>=0)符號就可惟一地確定分析器的動作是移進(jìn)還是歸約和用哪個產(chǎn)生式歸約,因而也就能惟一地確定句柄。LR分析法的歸約過程是規(guī)范推導(dǎo)的逆過程,所以LR分析過程是一種規(guī)范歸約過程。12 意義 LR(0)分析方法雖然對文法的限制比較大,對絕大多數(shù)高級語言的語法分析器不能適用,然而他是構(gòu)造其他LR類分析器的基礎(chǔ),學(xué)習(xí)和掌握LR(0)分析的原理和方法是我們掌握更高級語言語法分析的基礎(chǔ)。歸納起來,大體上可分為兩大類,即自頂向下分析方法和自底向上分析方法。自底向上分析方法是一種移進(jìn)-規(guī)約過程,當(dāng)分析的棧頂符

4、號串形成句柄時就采取歸約動作,因而自底向上分析法的關(guān)鍵問題是在分析過程中如何確定句柄。LR分析法正是給出一種能根據(jù)當(dāng)前分析棧中的符號串(通常以狀態(tài)表示)和向右順序查看輸人串的k個(k>=0)符號就可惟一地確定分析器的動作是移進(jìn)還是歸約和用哪個產(chǎn)生式歸約,因而也就能惟一地確定句柄。LR分析法的歸約過程是規(guī)范推導(dǎo)的逆過程,所以LR分析過程是一種規(guī)范歸約過程。13 預(yù)期目標(biāo)本次課程設(shè)計的目標(biāo)即是利用所學(xué)過的編譯原理的知識,利用LR(0)分析法,用C語言寫出一個簡單的LR(0)語法分析器。該語法分析器所要完成的功能是,對錄入的文法判斷它是否為LR(0)文法,如果是輸出LR (0)分析表

5、;在給定文法的情況下,能夠利用LR(0)分析表,對用戶輸入的一串字符串用LR(0)分析法進(jìn)行分析,判斷該字符串是否為符合給定文法的一個句子,建立文法及其LR分析表表示的數(shù)據(jù)結(jié)構(gòu),設(shè)計并實(shí)現(xiàn)一個LR(0)的分析器。14 面對的問題(1)分析表的構(gòu)造。(2)歸約還是移進(jìn)的判斷。(3)接受acc的判斷。(4)編程結(jié)果的輸出。在本次課程設(shè)計中,主要的是面對的文法的確定,以及分析其工作過程如何進(jìn)行。對于文法確定的問題,必須找到一個符合LR(0)規(guī)范的文法,并且該文法不易太復(fù)雜,否則對于初次編寫語法分析器的我們來說會比較復(fù)雜,否則容易出錯。第二個就是分析過程的問題,目前,我們只是了解了理論上LR(0)的分

6、析過程,但如何將該過程用程序去實(shí)現(xiàn),并且能夠?qū)σ粋€輸入串進(jìn)行實(shí)時的分析是比較復(fù)雜的。這涉及到對一個字符串進(jìn)行一個字符一個字符的讀取和操作,并且還要對幾個連在一起的字符進(jìn)行合并等操作,要求比較的高,對我們而言比較困難。在規(guī)范規(guī)約的過程中,一方面記住已移進(jìn)和規(guī)約出的整個符號串,另一方面根據(jù)所用的產(chǎn)生式推測未來可能碰到的輸入符號。當(dāng)一串句柄的符號串呈現(xiàn)于分析棧的頂端時,希望能夠根據(jù)上面過程中的數(shù)據(jù)來確定棧頂?shù)姆柎欠駱?gòu)成相對某一產(chǎn)生式的句柄。能正確初始化狀態(tài)棧,對棧內(nèi)元素的進(jìn)棧和出棧,取棧頂元素以及遍歷棧元素,LR分析方法是一種自底向上的分析方法,是一種個移進(jìn)-歸約的過程。當(dāng)分析的棧頂符號串形成句

7、柄時就采取歸約動作,因而自底向上分析法的關(guān)鍵問題是在分析過程忠如何確定句柄。LR(0)分析器是在分析過程中不需要察看輸入符號,因而它對文法的限制較大,對絕大多數(shù)高級語言的語法分析器是不能使用的,然而,他是構(gòu)造其他LR類分析器的基礎(chǔ)。1. 5 需解決的關(guān)鍵技術(shù)(1)詞法編譯器。(2)交互式面向?qū)ο蟮脑~法編譯器基本功能是。(3)根據(jù)規(guī)約規(guī)則對字符進(jìn)行歸約。(4)符合條件時采取移進(jìn)動作。二 系統(tǒng)分析21 涉及的基礎(chǔ)知識2.1.1 詞法編譯器功能(1)導(dǎo)入任意文法,也可以自己輸入。(2)輸出文法的分析過程,以及判斷是否為LR (0)文法,輸出分析表。(3)輸入句子,進(jìn)行語法分析。(4)輸出結(jié)

8、構(gòu)樹。2.1.2 詞法分析器的設(shè)計方法有如下四個步驟:(1)寫出該語言的詞法規(guī)則。(2)把詞法規(guī)則轉(zhuǎn)換為相應(yīng)的狀態(tài)轉(zhuǎn)換圖。(3)把各轉(zhuǎn)換圖的初態(tài)連在一起,構(gòu)成識別該語言的自動機(jī)。(4)設(shè)計掃描器;把掃描器作為語法分析的一個過程,當(dāng)語法分析需要一個單詞時,就調(diào)用掃描器。掃描器從初態(tài)出發(fā),當(dāng)識別一個單詞后便進(jìn)入終態(tài),送出二元式。2.1.3 動態(tài)模擬算法的基本功能(1)輸入LR分析表和一個句子。(2)輸出LR總控程序。(3)輸出依據(jù)句子構(gòu)對應(yīng)的語法樹的過程。(4)設(shè)計一個給定LR分析表,輸入一個句子,能由依據(jù)LR分析表輸出與句子對應(yīng)的語法樹,能對語法樹生成過程進(jìn)行模擬。 表 2-1 LR分析表STA

9、TEACTIONGOTOabcd#ETF0S2S311acc2S4S1063S5S474S4S1085S5S1196r1r1r1r1r17r2r2r2r2r28r3r3r3r3r39r5r5r5r5r510r4r4r4r4r411r6r6r6r6r6(5)輸入句子:bccd#。(6)根據(jù)文法產(chǎn)生的LR分析表。(7)輸出結(jié)果2.1.4 LR分析器的構(gòu)成一個LR分析器由個部分組成(1)總控程序,也可以稱為驅(qū)動程序。對所有的LR分析器,總控程序都是相同的。(2)分析表或分析函數(shù)。不同的文法分析表將不同,同一個文法采用的LR分析器不同時,分析表也不同,分析表又可以分為動作(ACTION)表和狀態(tài)轉(zhuǎn)換(

10、GOTO)表兩個部分,它們都可用二維數(shù)組表示。(3)分析棧,包括文法符號和相應(yīng)的狀態(tài)棧。它們均是先進(jìn)后出棧。分析器的動作由棧頂狀態(tài)和當(dāng)前輸入符號所決定(LR(0)分析器不需向前查看輸入符號)。2. 2解決問題的基本思路1、用構(gòu)造一個狀態(tài)轉(zhuǎn)換函數(shù)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換。2、再通過函數(shù)構(gòu)造一個移進(jìn)歸約函數(shù)實(shí)現(xiàn)移進(jìn)規(guī)約動作。3、采用構(gòu)造一個打印LR分析器的工作過程函數(shù)實(shí)現(xiàn)輸出。在規(guī)范規(guī)約的過程中,一方面記住已移進(jìn)和規(guī)約出的整個符號串,另一方面根據(jù)所用的產(chǎn)生式推測可能碰到的輸入符號。每一項(xiàng)ACTION(s,a)所規(guī)定的動作不外是下述四種可能之一:(1)移進(jìn):把(s,a)的下一個轉(zhuǎn)態(tài)s = GOTO(s,X)和輸

11、入符號a推進(jìn)棧,下一輸入符號變成現(xiàn)行輸入符號。(2)規(guī)約:指用某一產(chǎn)生式A 進(jìn)行規(guī)約。假若的長度為r,規(guī)約的動作是A,去除棧頂?shù)膔個項(xiàng),使?fàn)顟B(tài)Sm-r 變成棧頂狀態(tài),然后把(Sm-r,A)的下一狀態(tài)s = GOTO(Sm-r,A)和文法符號A推進(jìn)棧。規(guī)約動作不改變現(xiàn)行輸入符號。執(zhí)行規(guī)約動作意味著(= Xm-r+1Xm)已呈現(xiàn)于棧頂而且是一個相對于A的句柄。(3)接受:宣布分析成功,停止分析器的工作。(4)報錯:發(fā)現(xiàn)源程序含有錯誤,調(diào)用出錯處理程序。23 總體方案本課題是由一個四人的團(tuán)隊(duì)去完成的,所以,每個小組成員分配了不同的工作共同完成這個項(xiàng)目。24 功能模塊框圖運(yùn)行程序給出該程序所運(yùn)用的文法

12、和LR分析表用戶輸入字符串程序給出結(jié)果圖2.2功能模塊框圖三 系統(tǒng)設(shè)計 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é)符時則置ACTIONk,a為Sj,其動作含意為將終結(jié)符a移進(jìn)符號棧,狀態(tài)j進(jìn)入狀態(tài)

13、棧,(相當(dāng)狀態(tài)k時遇a轉(zhuǎn)向狀態(tài)j)。(2) 若項(xiàng)目A· 屬于Ik,則對任何終結(jié)符a 和'#'號置ACTIONk,a和ACTIONk,#為"rj",j為在文法G中某產(chǎn)生式A的序號。rj動作的含義是把當(dāng)前文法符號棧頂?shù)姆柎畾w約為A,并狀態(tài)棧指針從棧頂向下移動|的長度 , 文法符號棧從棧頂彈出|個符號,非終結(jié)符A變?yōu)楫?dāng)前面臨的符號。(3) 若GO(Ik,A)Ij,則置GOTOk,A為"j",其中A為非終結(jié)符,表示當(dāng)前狀態(tài)為"k"時,遇文法符號A時狀態(tài)應(yīng)轉(zhuǎn)向j,因此A移入文法符號棧,j移入狀態(tài)棧。(4) 若項(xiàng)目SS

14、·屬于Ik,則置ACTIONk,#為"acc",表示接受。(5) 凡不能用上述方法填入的分析表的元素,均應(yīng)填上"報錯標(biāo)志"。為了表的清晰我們僅用空白表示錯誤標(biāo)志。根據(jù)這種方法構(gòu)造的LR(0)分析表不含多重定義時,稱這樣的分析表為LR(0)分析表,能用LR(0)分析表的分析器稱為LR(0)分析器,能構(gòu)造LR(0)分析表的文法稱為LR(0)文法。3、產(chǎn)生如圖2-1所示的LR分析表這張分析表包括兩個部分,一是“動作”(ACTION)表,另一是“狀態(tài)轉(zhuǎn)換”(GOTO)表。ACTION(S,a)規(guī)定了當(dāng)狀態(tài)S面臨輸入符號a時應(yīng)采取什么動作。GOTO(S,

15、X)規(guī)定了狀態(tài)S面對文法符號X(終結(jié)符或非終結(jié)符)時下一狀態(tài)是什么。顯然,GOTO(S,X)定義了一個以文法符號為字母表的DFA。每一項(xiàng)ACTION(S,a)所規(guī)定的動作不外是下述四種可能之一:(1)移進(jìn)把(S,a)的下一個轉(zhuǎn)態(tài)S=GOTO(S,X)和輸入符號a推進(jìn)棧,下一輸入符號變成現(xiàn)行輸入符號。(2)規(guī)約指用某一產(chǎn)生式A進(jìn)行規(guī)約。假若的長度為r,規(guī)約的動作是A,去除棧頂?shù)膔個項(xiàng),使?fàn)顟B(tài)Sm-r變成棧頂狀態(tài),然后把(Sm-r,A)的下一狀態(tài)S=GOTO(Sm-r,A)和文法符號A推進(jìn)棧。規(guī)約動作不改變現(xiàn)行輸入符號。執(zhí)行規(guī)約動作意味著(=Xm-r+1Xm)已呈現(xiàn)于棧頂而且是一個相對于A的句柄。

16、(3)接受宣布分析成功,停止分析器的工作。(4)報錯發(fā)現(xiàn)源程序含有錯誤,調(diào)用出錯處理程序。一個LR分析器的工作過程可看成是棧里的狀態(tài)序列,已規(guī)約串和輸入串所構(gòu)成的三元式的變化過程。分析開始時的初始三元式為:(S0, #, a1a2an#)。 其中,S0為分析器的初態(tài);為句子的左括號;a1a2an為輸入串;其后的為結(jié)束符(句子右括號)。分析過程每步的結(jié)果可表示為:(S0S1Sm,#X1X2Xm ai, ai+1an#)。3. 2 實(shí)現(xiàn)方法3.2.1 構(gòu)造分析表LR分析器實(shí)質(zhì)上是一個帶先進(jìn)后出存儲器(棧)的確定有限狀態(tài)自動機(jī)。LR分析器的每一步工作是由棧頂狀態(tài)和現(xiàn)行輸入符號所唯一決定的。構(gòu)造一個i

17、nt型二維數(shù)組table139,用于存放LR分析表。并初始化。作者這樣規(guī)定:011 表示 狀態(tài)Sj,其中0對應(yīng)S0,1對應(yīng)S12126 表示 規(guī)約Rj,其中21對應(yīng)R1,22對應(yīng)R212 表示 “接受”。-1 表示 規(guī)約出錯,報錯。3.2.2程序設(shè)計關(guān)鍵(1)在輸入串(句子)輸入的過程中,涉及到一個壓棧的問題。但是輸入串壓入的字符順序剛好與原理中的字符串模型剛好相反,這樣需要先彈出的反而在棧底。為了既要保證字符串輸入,又要讓輸入的字符串存儲順序與輸入的字符串相反。采取以下措施:先將輸入的字符串壓入符號棧symbol中,然后符號棧彈出的字符再壓入輸入串棧instr中,這樣實(shí)現(xiàn)了輸入串的倒序存儲。

18、(2)狀態(tài)棧和符號棧輸出(遍歷)過程均采取自棧底到棧頂?shù)捻樞?,而輸入串棧則是采取自棧頂?shù)綏5椎捻樞蜉敵觥?.2.3 LR(0)項(xiàng)目集規(guī)范族的構(gòu)造識別活前輟的NFA我們可以利用子集法將其確定化。對確定化后的DFA如果把每個子集中所含狀態(tài)集對應(yīng)的項(xiàng)目寫在新的狀態(tài)中。對于構(gòu)成識別一個文法活前綴的DFA項(xiàng)目集(狀態(tài))的全體稱為這個文法的LR(0)項(xiàng)目集規(guī)范族,我們可以分析每個狀態(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?;仡櫽蒒FA確定化到DFA時,

19、E·aA和E·bB正是屬于S·E的閉包中。因而,可引入閉包函數(shù)(CLOSURE)來求DFA一個狀態(tài)的項(xiàng)目集。若文法G已拓廣為G,而S為文法G的開始符號,拓廣后增加產(chǎn)生式SS。如果I是文法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,再按上述三點(diǎn)求其閉包?;仡櫾跇?gòu)造

20、識別活前綴的NFA時,其兩個相鄰狀態(tài)對應(yīng)的項(xiàng)目是出自同一個產(chǎn)生式,只是圓點(diǎn)的位置相差1,箭弧上的標(biāo)記為前一個狀態(tài)和后一個狀態(tài)對應(yīng)項(xiàng)目圓點(diǎn)間的符號,(除了箭弧上標(biāo)記為的外)。由于識別活前綴的DFA的每個狀態(tài)是一個項(xiàng)目集,項(xiàng)目集中的每個項(xiàng)目都不相同,每個項(xiàng)目圓點(diǎn)后的符號不一定相同,因而對每個項(xiàng)目圓點(diǎn)移動一個位置后,箭弧上的標(biāo)記也不會完全相同,這樣,對于不同的標(biāo)記將轉(zhuǎn)向不同的狀態(tài)。例如初態(tài)S·E,E·aA,E·bB對第一個項(xiàng)目圓點(diǎn)右移一個位置后變?yōu)镾E·箭弧標(biāo)記應(yīng)為E,對第二個項(xiàng)目E·aA,圓點(diǎn)右移一個位置后,項(xiàng)目變?yōu)镋a·A,箭弧標(biāo)記為a

21、,同樣第三個項(xiàng)目為圓點(diǎn)右移一個位置后變?yōu)镋b·B,箭弧標(biāo)記為b,顯然,初態(tài)可發(fā)出三個不同標(biāo)記的箭弧,因而轉(zhuǎn)向三個不同的狀態(tài),也就由初態(tài)派生出三個新的狀態(tài),對于每個新的狀態(tài)我們又可以利用前面的方法,若圓點(diǎn)后為非終結(jié)符則可對其求閉包,得到該狀態(tài)的項(xiàng)目集。圓點(diǎn)后面為終結(jié)符或在一個產(chǎn)生式的最后,則不會再增加新的項(xiàng)目。初始化狀態(tài)棧,符號棧,輸入串棧輸入串各字符壓棧 求下一狀態(tài)符號ii = goto_char(status_p,instr_p)規(guī)約出錯!異常中止!i = = -1 ?規(guī)約成功!退出i = = 12 ?規(guī)約動作:1 求出i對應(yīng)規(guī)約規(guī)則右部字符串長度x = ri-21.y2 在符號棧

22、和狀態(tài)棧中彈出x個字符。然后將該規(guī)約規(guī)則左部壓入輸入串棧i>0 && i<=11 移進(jìn)動作:1 將現(xiàn)狀態(tài)i壓棧push(status_p,i)2 將當(dāng)前輸入串字符壓入符號棧a = pop(instr_p)push(symbol_p,a)打印該步工作過程33 詳細(xì)流程圖 圖3.2 LR分析器設(shè)計流程圖四 代碼編寫41 主要模塊的代碼分析4.1.1 生成分析表代碼void CLR0ForWinDlg:OnGtable() CTableDlg dlg;dlg.SetControlInfo(IDC_EXPLORER1, RESIZE_BOTH);dlg.SetControl

23、Info(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(t.GetAt(0)

24、;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("輸入的文法有誤,請檢查!", "錯誤",MB_OK | MB_IC

25、ONSTOP);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.GenerateLR0Table()

26、;dlg.DoModal();elseMessageBox("輸入的文法有誤,請檢查!", "錯誤",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 (!m_g.IsIn

27、Vt(m_input.GetAt(i)MessageBox("輸入的句子不全部由終結(jié)符組成", "錯誤", 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(100,szTemp

28、Path);: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>Untitled Doc

29、ument</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");out.Wri

30、teString("<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">n");out.WriteString("<tr>n<td nowrap>&nbsp;步驟&nbsp;</td>n<td nowrap>&nbsp;狀態(tài)棧

31、</td>n<td nowrap>&nbsp;符號棧&nbsp;</td>n<td nowrap>&nbsp;輸入串&nbsp;</td>n<td nowrap>&nbsp;ACTION&nbsp;</td>n<td nowrap >&nbsp;GOTO&nbsp;</td>n </tr>n");vector <int> Status;vector <char> Symbol;i

32、nt 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(iPos);int

33、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(ToDo.two).Get

34、Right().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.push_back(m_g.

35、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 0:bErrorFl

36、ag = 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);Ma

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論