專利名稱:基于回溯自動機(jī)語法分析的jsax解析器和解析方法
技術(shù)領(lǐng)域:
本發(fā)明屬于Web技術(shù)領(lǐng)域,主要涉及可擴(kuò)展標(biāo)記語言XML(eXtensible MarkupLanguage)文檔的解析技術(shù),尤其涉及基于簡單應(yīng)用程序接口 SAX (Simple API for XML)的XML文檔解析技術(shù),具體是一種基于回溯自動機(jī)語法分析的JSAX解析器和解析方法,可應(yīng)用于對XML文檔的解析。
背景技術(shù):
近幾年來,XML以其應(yīng)用簡單、使用靈活的優(yōu)勢,被廣泛應(yīng)用于Web環(huán)境下的數(shù)據(jù)傳輸與交換、數(shù)據(jù)集成、文檔存儲等領(lǐng)域中,最典型的就是Web服務(wù)Web Service, WebService中的SOAP協(xié)議及WSDL都是基于XML的,此外,XML在數(shù)學(xué)、化學(xué)、物理等諸多領(lǐng)域 中也有很多應(yīng)用,如化學(xué)領(lǐng)域中用于描述分子信息的化學(xué)標(biāo)記語言CML。XML文檔解析器在現(xiàn)階段Web應(yīng)用技術(shù)中對通用數(shù)據(jù)交換與處理起著關(guān)鍵性的作用。隨著基于XML的應(yīng)用越來越廣泛,各類工業(yè)應(yīng)用和科學(xué)研究對XML文檔解析器的性能也提出了越來越高的要求,一個高性能的XML解析器對于提高解析XML文檔的速度和系統(tǒng)吞吐量至關(guān)重要。目前針對各類不同需求,陸續(xù)出現(xiàn)了文檔對象模型DOM、SAX等解析接口標(biāo)準(zhǔn)。SAX接口是一種基于事件的解析API(應(yīng)用程序接口),SAX解析器采用了基于事件的模型,它在解析XML文檔時可以觸發(fā)一系列的事件供用戶處理,常用的事件類型有startDocument,表不文檔的開始;endDocument,表不文檔的結(jié)束;startElement,表示標(biāo)記的開始;endElement,表示標(biāo)記的結(jié)束!characters,表示文本內(nèi)容事件;ignoreWhitespace,表示空白事件。處理完的事件會從內(nèi)存中刪除,并釋放掉它所占有的資源,因為它的性能優(yōu)勢和簡單易用,已被開發(fā)者和用戶廣為使用。當(dāng)SAX解析器在解析XML文檔時,需要對XML文檔進(jìn)行詞法分析和語法分析。最為通用的進(jìn)行詞法分析的模型是有限自動機(jī)FA,根據(jù)XML規(guī)范可知,構(gòu)成XML的記號是用正規(guī)文法來描述的,F(xiàn)A可以識別用正規(guī)文法描述的記號,由于FA易于構(gòu)造、分析效率高的優(yōu)點(diǎn),所以FA被廣泛應(yīng)用于詞法分析器的設(shè)計。進(jìn)行語法分析的方法則有多種選擇,Van Engelen曾采用遞歸下降分析recursive descent parsers對XML文檔進(jìn)行語法分析,但是由于遞歸實現(xiàn)的過程需要維護(hù)系統(tǒng)堆棧,空間上消耗較大,而且遞歸也帶來了大量的函數(shù)調(diào)用,導(dǎo)致了額外的時間開銷,所以遞歸下降分析效率不高。另外一種通用的進(jìn)行語法分析的工具是下推自動機(jī)PDA,下推自動機(jī)的識別能力比有限自動機(jī)強(qiáng),但是下推自動機(jī)構(gòu)造起來比較復(fù)雜,在進(jìn)行語法分析時的每一步動作都要根據(jù)當(dāng)前狀態(tài)、當(dāng)前輸入和下推棧中的內(nèi)容來確定改變格局的動作,改變下推棧和剩余輸入的狀態(tài)從而進(jìn)入到下一格局,導(dǎo)致分析效率不聞。因此,提高XML解析器的語法分析器的效率勢在必行,一個高性能的XML解析器對于提聞解析XML文檔的速度會有很大的提聞,可以有效提聞系統(tǒng)的響應(yīng)速度和吞吐量。本發(fā)明項目對國內(nèi)外專利文獻(xiàn)和公開發(fā)表的期刊論文檢索,尚未發(fā)現(xiàn)與本發(fā)明密切相關(guān)和一樣的報道或文獻(xiàn)。
發(fā)明內(nèi)容
本發(fā)明主要針對XML解析器的語法分析器效率低下難于實現(xiàn)等問題,通過對回溯自動機(jī)進(jìn)行改進(jìn),提供一種新的高效率、能夠識別具有嵌套結(jié)構(gòu)的標(biāo)記匹配串語言并易于實現(xiàn)的基于回溯自動機(jī)語法分析JSAX解析器和解析方法。本發(fā)明可應(yīng)用于對XML文檔的解析。下面對本發(fā)明進(jìn)行詳細(xì)說明。 本發(fā)明是一種基于SAX接口的XML解析器和解析方法,本發(fā)明目前不支持對帶有名字空間的XML文檔的解析,本發(fā)明屬于標(biāo)準(zhǔn)XML解析器。本發(fā)明是一種基于回溯自動機(jī)語法分析的JSAX解析器,包括詞法分析器,語法分析器,和事件處理器,詞法分析器負(fù)責(zé)讀取XML文檔的內(nèi)容,將讀取的記號輸出給語法分析器,語法分析器根據(jù)XML規(guī)范要求識別輸入記號流中的語言結(jié)構(gòu),將相應(yīng)的事件信息傳遞給事件處理器,事件處理器接受解析器報告的所有事件,并處理所發(fā)現(xiàn)的數(shù)據(jù),實現(xiàn)對XML文檔的解析,其中語法分析器是基于自動機(jī)構(gòu)造的,自動機(jī)中的回溯自動機(jī)的結(jié)構(gòu)為五元組,結(jié)構(gòu)為M= (S,E, δ,%,F(xiàn)),還包含有一個狀態(tài)棧用來保存運(yùn)行的部分歷史,其特征在于所述語法分析器是基于回溯自動機(jī)來實現(xiàn)的,所述回溯自動機(jī)是改進(jìn)回溯自動機(jī),具體是對回溯自動機(jī)的動作轉(zhuǎn)移規(guī)則δ重新定義,該定義為規(guī)則性定義,包括(I)若δ (q,a) = P,即在狀態(tài)q下,當(dāng)讀入記號a時,將當(dāng)前狀態(tài)q壓入棧頂,其中a代表需要進(jìn)行入棧動作的記號;(2)若δ (q, b) = trace,即在狀態(tài)q下,當(dāng)讀入記號b時,并且狀態(tài)棧不為空時,彈出狀態(tài)棧棧頂P,并且控制轉(zhuǎn)向P狀態(tài),其中b代表需要進(jìn)行回溯動作的記號;(3)若δ (q,c) = p,即在狀態(tài)q下,當(dāng)讀入記號c時,不需要進(jìn)行棧操作,其中c代表不需要進(jìn)行棧操作的記號;(4)若δ (q,d),若d是空白字符(空白字符不屬于輸入字符集,表示字符串結(jié)束),則停機(jī)并且在q e F時接受輸入字符串,在qg F時拒絕接受;(5)若δ (q,e)無定義,則停機(jī)并拒絕接受輸入字符串。本發(fā)明的語法分析器是基于回溯自動機(jī)實現(xiàn)的,對回溯自動機(jī)進(jìn)行了改進(jìn),并將改進(jìn)的回溯自動機(jī)應(yīng)用于XML解析器語法分析器以簡化語法分析器的設(shè)計和實現(xiàn),有效提高了 JSAX解析器的效率。本發(fā)明的實現(xiàn)還在于,給出了與改進(jìn)回溯自動機(jī)相等價的文法形式A —其中a e T(a屬于終結(jié)符T),β e {N0 U N1 U Ν2} (β是零個、一個或者兩個非終結(jié)符N的串);并且當(dāng)β中含有兩個非終結(jié)符時,產(chǎn)生式的結(jié)構(gòu)為A —aCA,該結(jié)構(gòu)要求產(chǎn)生式右部第二個非終結(jié)符和產(chǎn)生式左邊的非終結(jié)符相同,其中A、C是非終結(jié)符;該文法的描述能力比正規(guī)文法RG強(qiáng),但比上下文無關(guān)文法CFG弱,是CFG的子集,介于RG與CFG之間。本發(fā)明不僅對回溯自動機(jī)的動作轉(zhuǎn)移函數(shù)進(jìn)行了重新定義,還給出了與改進(jìn)后的回溯自動機(jī)相等價的文法,該文法可以描述具有嵌套層次結(jié)構(gòu)的標(biāo)記匹配串語言。本發(fā)明的實現(xiàn)還在于用與改進(jìn)回溯自動機(jī)等價的文法來描述XML語法定義,得至IJ描述XML文檔語法規(guī)則,根據(jù)這些語法規(guī)則構(gòu)造改進(jìn)回溯自動機(jī),識別XML文檔記號流中的語言結(jié)構(gòu),判斷是否符合語法規(guī)范,完成語法分析。本發(fā)明的實現(xiàn)還在于用與改進(jìn)回溯自動機(jī)文法等價的用來描述XML語法定義的規(guī)則,也就是用形如“A —a β ”的文法形式構(gòu)建用于描述XML語法定義的語法規(guī)則,這些規(guī)則即描述XML語法定義語法規(guī)則,包括document: : = prolog element Misc*element: : = EmptyElemTag | AA: : = STag B AContent_item:: = CharData|Reference|CDSect|PI|Comment|EmptyElemTag
B: : = Content_item BB: : = STag_B BB: : = ETagA: : = MiscsMiscs: : = ε Misc_Miscs其中,document表示XML文檔;prolog用來描述聲明信息及文檔類型聲明doctypedecl ;Element表示出現(xiàn)在XML文檔中的元素,描述的是嵌套的具有層次結(jié)構(gòu)的標(biāo)記匹配串;STag表示開始標(biāo)記;CharData表示字符數(shù)據(jù)!Reference表示引用;Q)Sect表示CDATA段;PI表示處理指令;Comment表示注釋;EmptyElemTag表示空元素標(biāo)記;STag表示開始標(biāo)記;Misc表示XML文檔中的空白、處理指令及注釋。并且要求出現(xiàn)在element中的開始標(biāo)記和結(jié)束標(biāo)記必須正確嵌套和匹配。重新定義的描述XML語法定義的語法規(guī)則可以用與等價回溯自動機(jī)的文法來描述,屬于上下文無關(guān)文法的子集。本發(fā)明的實現(xiàn)還在于根據(jù)描述XML語法定義的語法規(guī)則,構(gòu)造改進(jìn)回溯自動機(jī)讀取來自詞法分析器輸出的XML文檔中的記號流中的語言結(jié)構(gòu),完成語法分析,所構(gòu)造的改進(jìn)回溯自動機(jī)TA為M= (S, Σ , 3,q0,F(xiàn)),其中,M即為構(gòu)造的回溯自動機(jī)狀態(tài)集合SdStl, S1, S2, S3, trace},其中Stl表示解析開始狀態(tài),S1表示解析完XMLDecl之后的狀態(tài),S2解析完doctypedecl之后到達(dá)的狀,S3解析完根元素STag之后開始解析content的狀態(tài),trace表示解析完一個ETag需要進(jìn)入回溯狀態(tài)。輸入符號集合Σ :{XMLDecl, Misc, doctypedecl, EmptyElemTag, STag, Reference, CDSect,CharData, PI, CDSection, Comment, ETag};開始狀態(tài)q。 S0;終態(tài)集F JS1, S2};狀態(tài)棧stack (S1, S2, S3I ;轉(zhuǎn)移函數(shù)δ,δ :SX Σ— S U {trace},是下列轉(zhuǎn)移的集合(I) (S0, XMLDecl) = S1 :在開始狀態(tài),讀入記號為XML聲明XMLDecl,則轉(zhuǎn)移到S1W態(tài);(2) (S1, Misc) = S1 :在S1W態(tài)讀入記號為Misc (即空白字符、注釋或者處理指令),則循環(huán)讀取記號Misc ;(3) (S1, STag) = S3 :在S1狀態(tài)讀入記號為開始標(biāo)記STag,則將當(dāng)前狀態(tài)S1壓入狀態(tài)棧棧頂,將開始標(biāo)記名壓入名字棧棧頂,轉(zhuǎn)移到S3狀態(tài);(4) (S1, doctypedecl) = S2 :在 S1 狀態(tài)讀入記號為 doctypedecl,轉(zhuǎn)到 S2 狀態(tài);(5) (S2, Misc) = S2 :在S2狀態(tài)讀入記號為Misc (空白字符、注釋或者處理指令)則循環(huán)解析Misc,狀態(tài)棧不改變;(6) (S2, STag) = S3 :在S2狀態(tài)讀入記號為開始標(biāo)記STag,將開始標(biāo)記名壓入名字棧棧頂,將當(dāng)前狀態(tài)S2壓入狀態(tài)棧棧頂,轉(zhuǎn)移到S3狀態(tài);
(7) (S3, Content_item) = S3 :循環(huán)讀取不需入棧的記號,狀態(tài)棧不改變;(8) (S3, STag) = S3 :在S3狀態(tài)讀入記號為開始標(biāo)記STag,將當(dāng)前狀態(tài)S3壓入狀態(tài)棧棧頂,將開始標(biāo)記名壓入名字棧棧頂;(9) (S3, ETag) = trace :在S3狀態(tài)讀入記號為結(jié)束標(biāo)記ETag,則轉(zhuǎn)向狀態(tài)棧棧頂狀態(tài)P,并且彈出狀態(tài)棧棧頂P,同時彈出名字棧棧頂記號與ETag標(biāo)簽的名字進(jìn)行對比,如果相同,表明標(biāo)記正確匹配,否則報告錯誤。本發(fā)明對回溯自動機(jī)的動作轉(zhuǎn)移函數(shù)重新進(jìn)行定義,給出了與之等價的文法,并用該文法對XML語法重新進(jìn)行描述,并給出了語法規(guī)則,并根據(jù)這些語法規(guī)則構(gòu)造出了改進(jìn)回溯自動機(jī),該自動機(jī)讀取記號流中的語言結(jié)構(gòu),高效的進(jìn)行語法分析。本發(fā)明還是一種基于回溯自動機(jī)語法分析的JSAX解析方法,使用上述的基于回溯自動機(jī)語法分析的JSAX解析器,在Eclipse環(huán)境下對XML文檔進(jìn)行解析,具體解析步驟包括步驟I.首先在開始時由詞法分析器讀取XML文檔中的XMLDecl記號,對XMLDecl進(jìn)行解析,判斷是否符合XMLDecl規(guī)范,對于符合規(guī)范的XMLDecl繼續(xù)進(jìn)行解析,對于不符合的直接報告錯誤;步驟2.符合規(guī)范的XMLDecl,判斷下一個記號是否有Miscs存在,如果有,對Miscs循環(huán)進(jìn)行解析;步驟3.解析完Miscs后,判斷下一個記號是否為doctypedecl,如果是,進(jìn)行步驟4,否則進(jìn)行步驟5 ;步驟4.解析doctypedecl,解析完doctypedecl之后,判斷下一個記號是否為Miscs,如果是則對Miscs循環(huán)進(jìn)行解析;否則轉(zhuǎn)向步驟6 ;步驟5.解析完doctypedecl后,判斷下一個記號是不是空元素標(biāo)記,若不是空元素標(biāo)記則進(jìn)入步驟6 ;若是則對空元素標(biāo)記進(jìn)行解析,然后進(jìn)入步驟10 ;步驟6.判斷下一個記號是否為開始標(biāo)記,如果是,對開始標(biāo)記進(jìn)行解析,并將當(dāng)前狀態(tài)壓入狀態(tài)棧的棧頂,將開始標(biāo)記名壓入名字棧棧頂;否則報錯;步驟7.如果下一個記號是不需要進(jìn)行入棧操作的記號,如CharData, (!(Section,Comment, Reference, PI, EmptyElemTag, S,分別對相應(yīng)記號進(jìn)行解析,繼續(xù)下一步;如果下一個記號是開始標(biāo)記STag,則轉(zhuǎn)向步驟6 ;步驟8.判斷下一個記號是否為結(jié)束標(biāo)記,若是,對結(jié)束標(biāo)記進(jìn)行解析,彈出狀態(tài)棧棧頂狀態(tài),作為自動機(jī)的下一狀態(tài),同時彈出名字棧棧頂記號,判斷該記號是否與當(dāng)前的結(jié)束標(biāo)記名相同,如果相同則進(jìn)入下一步,否則表明開始標(biāo)記與結(jié)束標(biāo)記不匹配,報告錯誤;步驟9.解析完一個結(jié)束標(biāo)記后檢查狀態(tài)棧是否為空,若為空則進(jìn)行步驟10,否則轉(zhuǎn)向步驟7 ;步驟10.判斷文檔是否還有記號,如果沒有,表明已經(jīng)讀到XML文檔末尾,解析結(jié)束;如果文檔還有記號,則判斷下一個記號是不是Miscs,若不是則報告錯誤,若是則對Miscs記號進(jìn)行解析,直到讀到XML文檔的末尾,完成對整個XML文檔的解析過程,解析結(jié)束。與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)(I)本發(fā)明對回溯自動機(jī)進(jìn)行了改進(jìn),使得改進(jìn)的回溯自動機(jī)能夠識別XML這樣的具有嵌套結(jié)構(gòu)的標(biāo)記匹配串語言;同時本發(fā)明給出了改進(jìn)的回溯自動機(jī)的規(guī)則和與改進(jìn)回溯自動機(jī)等價的文法。
(2)本發(fā)明由于將改進(jìn)的回溯自動機(jī)應(yīng)用于JSAX解析器的語法分析器,同下推自動機(jī)實現(xiàn)的語法分析器相比較,有效的簡化了 JSAX解析器的語法分析器的設(shè)計和實現(xiàn)。(3)本發(fā)明由于采用了改進(jìn)的回溯自動機(jī)進(jìn)行語法分析,同遞歸下降子程序和下推自動機(jī)實現(xiàn)的語法分析器相比較,效率上有了明顯的提高。(4)本發(fā)明給出的JSAX解析器符合SAX接口規(guī)范要求,用戶可以很方便的通過SAX接口來完成對XML文檔的解析。
圖I為本發(fā)明JSAX解析器的語法分析器對應(yīng)回溯自動機(jī)的狀態(tài)轉(zhuǎn)換圖;圖2為本發(fā)明JSAX解析器的體系結(jié)構(gòu)示意圖;圖3為一個簡單的XML文檔;圖4為本發(fā)明JSAX解析器的詞法分析器需要識別XML中記號的狀態(tài)轉(zhuǎn)移圖;圖5為本發(fā)明基于回溯自動機(jī)語法分析JSAX解析器中解析方法的流程示意圖;圖6為本發(fā)明對圖3中所示的XML文檔解析后的結(jié)果示意圖;圖7為本發(fā)明JSAX解析器與Xerces解析器的性能對比曲線圖。
具體實施例方式本發(fā)明是一種基于SAX接口的XML文檔解析器和解析方法,屬于Web技術(shù)領(lǐng)域,主要涉及對XML文檔基于SAX接口的解析技術(shù)。XML可擴(kuò)展標(biāo)記語言是計算機(jī)及Internet中一種通用的數(shù)據(jù)交換語言,隨著計算機(jī)和互聯(lián)網(wǎng)在工業(yè)生產(chǎn)及人們?nèi)粘I畹膹V泛應(yīng)用,XML的應(yīng)用也將滲透到各個領(lǐng)域,XML將扮演越來越重要的角色,XML以其應(yīng)用簡單、使用靈活的優(yōu)勢,被廣泛應(yīng)用于Web環(huán)境下的數(shù)據(jù)傳輸與交換、數(shù)據(jù)集成、文檔存儲等領(lǐng)域中,最典型的就是Web服務(wù)Web Service, Web Service中的SOAP協(xié)議及WSDL都是基于XML的,XML不僅已經(jīng)廣泛應(yīng)用于計算機(jī)及網(wǎng)絡(luò)的各個方面,還應(yīng)用于機(jī)械、物理、化學(xué)、數(shù)學(xué)等領(lǐng)域,并發(fā)揮著越來越重要的作用,對XML的應(yīng)用正逐漸興起,并在Internet上迅速發(fā)展,XML解析器在現(xiàn)階段Web應(yīng)用技術(shù)中對通用數(shù)據(jù)交換與處理起著關(guān)鍵性的作用。本發(fā)明正是一種XML解析器,應(yīng)用于對X見文檔的解析。本發(fā)明JSAX解析器采用了基于事件的模型,它在解析XML文檔時可以觸發(fā)一系列的事件,常用的事件類型有startDocument,表示文檔開始事件;endDocument,表示文檔結(jié)束事件;startElement,表示標(biāo)記開始事件;endElement,表示標(biāo)記結(jié)束事件;characters,表示文本內(nèi)容事件;ignoreWhitespace,表示空白事件。當(dāng)解析器發(fā)現(xiàn)指定的標(biāo)記,會產(chǎn)生一個事件報告給事件處理器,事件處理器會激活一個回調(diào)方法,告訴該方法指定的標(biāo)簽已經(jīng)找到,應(yīng)用程序可以通過該方法來訪問指定標(biāo)簽的具體內(nèi)容。處理完的事件會從內(nèi)存中刪除,并釋放掉它所占有的資源,因此,SAX解析器占有非常少的系統(tǒng)資源。當(dāng)SAX解析器在解析XML文件時,需要對XML文檔進(jìn)行詞法和語法分析。遞歸下降分析方法實現(xiàn)的語法分析器難于構(gòu)造,空間消耗比較大;而最為通用的用于語法分析的下推自動機(jī)雖然功能強(qiáng)大,但是構(gòu)造起來比較復(fù)雜,而且分析效率也不高。針對這一問題,本發(fā)明通過將改進(jìn)的回溯自動機(jī)應(yīng)用于XML解析器語法分析器以簡化語法分析器的設(shè)計和實現(xiàn),從而有效提高了 JSAX解析器的效率。以下參照附圖對本發(fā)明進(jìn)行詳細(xì)描述。
實施例I本發(fā)明是基于回溯自動機(jī)語法分析的JSAX解析器,參見圖2,包括詞法分析器,語法分析器和事件處理器,詞法分析器負(fù)責(zé)讀取XML文檔的內(nèi)容,將讀取的記號輸出給語法分析器,語法分析器根據(jù)XML規(guī)范要求識別輸入記號流中的語言結(jié)構(gòu),將相應(yīng)的事件信息傳遞給事件處理器,事件處理器接受解析器報告的所有事件,并處理所發(fā)現(xiàn)的數(shù)據(jù),實現(xiàn)對XML文檔的解析,其中語法分析器是基于自動機(jī)構(gòu)造的,自動機(jī)中回溯自動機(jī)的結(jié)構(gòu)為五元組,結(jié)構(gòu)為M= (S,E, S,q(l,F(xiàn)),還包含有一個狀態(tài)棧用來保存運(yùn)行的部分歷史,本發(fā)明的語法分析器是基于回溯自動機(jī)實現(xiàn)的。詞法分析器詞法分析器負(fù)責(zé)讀取XML文檔的內(nèi)容,讀取字符或者字符串給語法分析部分,判斷構(gòu)成XML文檔的標(biāo)簽及記號是否符合XML的規(guī)范,并將記號提供給用于語法分析的回溯自動機(jī)作為輸入。由于XML中的記號使用正規(guī)文法來進(jìn)行描述的,本發(fā)明通過構(gòu)造有限自動機(jī)來完成對XML文檔的詞法分析。語法分析器根據(jù)語法規(guī)則識別詞法分析器提供的記號流中的語言結(jié)構(gòu),并將相應(yīng)的事件信息傳遞給事件處理器。對于不良夠的XML文檔,JSAX解析器會報告錯誤XML文檔的信息。為了完成對XML文檔的語法分析,本發(fā)明對回溯自動機(jī)進(jìn)行了改進(jìn),使得改進(jìn)的自動機(jī)能夠識別像XML這樣的具有嵌套的層次結(jié)構(gòu)的標(biāo)記匹配串語言。在進(jìn)行語法分析時,當(dāng)改進(jìn)回溯自動機(jī)讀入的記號為開始標(biāo)記時,則將當(dāng)前狀態(tài)壓入狀態(tài)棧的棧頂;當(dāng)改進(jìn)回溯自動機(jī)讀入的記號為結(jié)束標(biāo)記時,則當(dāng)狀態(tài)棧不為空時,彈出棧頂狀態(tài)P,控制轉(zhuǎn)向狀態(tài)P,否則報錯;當(dāng)改進(jìn)回溯自動機(jī)讀入的記號為其它標(biāo)記或者記號時,不進(jìn)行棧操作。為了完成對標(biāo)記的匹配操作,還需要一個名字棧來存儲開始標(biāo)記名,當(dāng)讀入記號為開始標(biāo)記時,將開始標(biāo)記名壓入名字棧,當(dāng)讀入的記號為結(jié)束標(biāo)記時,彈出名字棧棧頂并與結(jié)束標(biāo)記名進(jìn)行比較,如果名字不同則報告錯誤。事件處理器事件處理器接受解析器報告的所有事件,并處理所發(fā)現(xiàn)的數(shù)據(jù),將文檔信息返回給用戶進(jìn)行處理。具體是在語法分析的同時,通過標(biāo)準(zhǔn)的回調(diào)函數(shù)將符合語法規(guī)范的XML文檔信息返回給用戶。本發(fā)明的回溯自動機(jī)是改進(jìn)回溯自動機(jī),具體是對回溯自動機(jī)的動作轉(zhuǎn)移規(guī)則δ重新定義,該定義為規(guī)則性定義,包括
(I)若δ (q, a) = p,即在狀態(tài)q下,當(dāng)讀入記號a時,將當(dāng)前狀態(tài)q壓入棧頂,其中a代表需要進(jìn)行入棧動作的記號。本發(fā)明中,在狀態(tài)q時,讀入記號為開始標(biāo)記STagJlJ將當(dāng)前狀態(tài)q壓棧,S卩δ (q, STag) = p。(2)若δ (q, b) = trace,即在狀態(tài)q下,當(dāng)讀入記號b時,并且狀態(tài)棧不為空時,彈出狀態(tài)棧棧頂P,并且控制轉(zhuǎn)向P狀態(tài),其中b代表需要進(jìn)行回溯動作的記號。本發(fā)明中,在狀態(tài)q時,讀入記號為結(jié)束標(biāo)記ETag,則進(jìn)行回溯,彈出棧頂狀態(tài)P,并且自動機(jī)轉(zhuǎn)向狀態(tài)P,即 δ (q, ETag) = trace。(3)若δ (q,c) =p,即在狀態(tài)q下,當(dāng)讀入記號c時,不需要進(jìn)行棧操作,其中c代表不需要進(jìn)行棧操作的記號。本發(fā)明中,在狀態(tài)q時,讀入記號Token為⑶Sect,PI,EmptyElemTag, Reference, Comment, CharData,則狀態(tài)不改變,并且不進(jìn)行棧操作,即 δ (q,Token) — Qo(4)若d是空白字符(空白字符不屬于輸入字符集,表示字符串結(jié)束),則停機(jī)并 且在q e F(q屬于一個終止?fàn)顟B(tài))時接受輸入字符串,在qe F時拒絕接受。本發(fā)明中,在q狀態(tài)下讀入記號為空白記號,則當(dāng)q為終止?fàn)顟B(tài)時停機(jī)并接受該字符串,即當(dāng)δ (q,ε),并且q e F,停機(jī)并接受輸入字符串。(5)若δ (q,e)無定義,則停機(jī)并拒絕接受輸入字符串。與改進(jìn)回溯自動機(jī)相等價的文法結(jié)構(gòu)為A — a β其中a e T(a屬于終結(jié)符T),β e {N0 U N1 U Ν2} (β是零個、一個或者兩個非終結(jié)符N的串);并且當(dāng)β中含有兩個非終結(jié)符時,產(chǎn)生式的結(jié)構(gòu)為A —aCA,該結(jié)構(gòu)要求產(chǎn)生式右部第二個非終結(jié)符和產(chǎn)生式左邊的非終結(jié)符相同,其中A、C是非終結(jié)符;該文法的描述能力比正規(guī)文法RG強(qiáng),但比上下文無關(guān)文法CFG弱,是CFG的子集,介于RG與CFG之間。用與改進(jìn)回溯自動機(jī)等價的文法來描述XML語法定義,得到描述XML文檔的語法規(guī)則,根據(jù)這些語法規(guī)則構(gòu)造改進(jìn)回溯自動機(jī),識別XML文檔記號流中的語言結(jié)構(gòu),判斷是否符合語法規(guī)范,完成語法分析;與改進(jìn)回溯自動機(jī)文法等價的用來描述XML語法定義的規(guī)則也就是用結(jié)構(gòu)如“A — a β ”的文法形式構(gòu)建用于描述XML語法定義的語法規(guī)則,具體包括document:: = prolog element Misc氺element: : = EmpryElemTag | AA: : = STag B AContent_item:: = CharData|Reference|CDSect|PI|Comment|EmptyElemTagB: : = Content_item BB: : = STag B BB: : = ETagA: : = MiscsMiscs: : = ε Misc Miscs其中,document表示XML文檔;prolog用來描述聲明信息及文檔類型聲明doctypedecl ;element描述的是嵌套的具有層次結(jié)構(gòu)的標(biāo)記匹配串,要求出現(xiàn)在element中的標(biāo)記必須正確嵌套和匹配;STag表示開始標(biāo)記;CharData表示字符數(shù)據(jù)!Reference表示引用;Q)Sect表示CDATA段;PI表示處理指令;Comment表示注釋;EmptyElemTag表示空元素標(biāo)記;STag表示開始標(biāo)記;Misc*表示XML文檔中的空白、處理指令及注釋;B是一個非終結(jié)符,可以替換為結(jié)束標(biāo)記ETag或者STag B B ;A是一個非終結(jié)符,可以替換為Miscs或者 STag B A0根據(jù)描述XML語法定義的規(guī)則,構(gòu)造改進(jìn)回溯自動機(jī),用改進(jìn)回溯自動機(jī)讀取來自詞法分析器輸出的XML文檔中的記號流中的語言結(jié)構(gòu),完成語法分析,參照圖I所構(gòu)造的改進(jìn)回溯自動機(jī)TA為M = (S, Σ,δ,q0, F),其中M表示構(gòu)造的回溯自動機(jī);狀態(tài)集合SdStl, S1, S2, S3, trace},其中Stl表示解析開始狀態(tài),S1表示解析完 XMLDecl之后的狀態(tài),S2解析完doctypedecl之后到達(dá)的狀態(tài),S3解析完根元素STag之后開始解析content的狀態(tài),trace表示解析完一個ETag需要進(jìn)入回溯狀態(tài)。輸入符號集合Σ {XMLDecl, Misc, doctypedecl, EmptyElemTag, STag, Reference, CDSect,CharData, PI, CDSection, Comment, ETag};開始狀態(tài)q^S。;終態(tài)集F : , S2};狀態(tài)棧stack :{S1; S2,S3, Z};(其中 Z 表示棧底)轉(zhuǎn)移函數(shù)δ,δ :SX Σ —SU {trace},參照附圖1,轉(zhuǎn)移函數(shù)是下列轉(zhuǎn)移的集合(I) (S0,XMLDecl) = S1 :在開始狀態(tài),讀入記號為XML聲明XMLDecl,則轉(zhuǎn)移到S1狀態(tài);(2) (S1, Misc) = S1 :在S1W態(tài)讀入記號為Misc (即空白字符、注釋或者處理指令),則循環(huán)讀取記號Misc ;(3) (S17STag) = S3 :在S1狀態(tài)讀入記號為開始標(biāo)記STag,則將當(dāng)前狀態(tài)S1壓入狀態(tài)棧棧頂,將開始標(biāo)記名壓入名字棧棧頂,轉(zhuǎn)移到S3狀態(tài);(4) (S1, doctypedecl) = S2 :在 S1 狀態(tài)讀入記號為 doctypedecl,轉(zhuǎn)到 S2 狀態(tài);(5) (S2, Misc) = S2 :在S2狀態(tài)讀入記號為Misc (空白字符、注釋或者處理指令)則循環(huán)解析Misc,狀態(tài)棧不改變;(6) (S2, STag) = S3 :在S2狀態(tài)讀入記號為開始標(biāo)記STag,將開始標(biāo)記名壓入名字棧棧頂,將當(dāng)前狀態(tài)S2壓入狀態(tài)棧棧頂,轉(zhuǎn)移到S3狀態(tài);(7) (S3, Content_item) = S3 :循環(huán)讀取不需入棧的記號,狀態(tài)棧不改變;(8) (S3, STag) = S3 :在S3狀態(tài)讀入記號為開始標(biāo)記STag,將當(dāng)前狀態(tài)S3壓入狀態(tài)棧棧頂,將開始標(biāo)記名壓入名字棧棧頂;(9) (S3, ETag) = trace :在S3狀態(tài)讀入記號為結(jié)束標(biāo)記ETag,貝U轉(zhuǎn)向狀態(tài)棧棧頂狀態(tài)P,并且彈出狀態(tài)棧棧頂P,同時彈出名字棧棧頂記號與ETag標(biāo)簽的名字進(jìn)行對比,如果相同,表明標(biāo)記正確匹配,否則報告錯誤。本發(fā)明對回溯自動機(jī)進(jìn)行了改進(jìn),給出了與改進(jìn)回溯自動機(jī)相等價的文法,并用該文法對XML的語法規(guī)則重新進(jìn)行了定義,給出了描述XML文檔的語法規(guī)則,根據(jù)這些語法規(guī)則構(gòu)造改進(jìn)的回溯自動機(jī),用構(gòu)造的回溯自動機(jī)識別輸入流中的語言結(jié)構(gòu)。為了完成對XML文檔的語法分析,在回溯自動機(jī)讀入記號為開始標(biāo)記STag時,則轉(zhuǎn)向下一狀態(tài),并將當(dāng)前狀態(tài)壓入狀態(tài)棧棧頂;當(dāng)讀入記號為結(jié)束標(biāo)記ETag時,則自動機(jī)轉(zhuǎn)向狀態(tài)棧棧頂狀態(tài)P,并將P彈出棧頂;當(dāng)讀入記號為其它記號,如Comment, (CDSect, PI, CharData時,貝U不需要進(jìn)行棧操作;當(dāng)在終止?fàn)顟B(tài)讀入記號為空記號時,則接受該文檔,表明該文檔符合XML語法規(guī)則?;厮葑詣訖C(jī)的引入,有效的簡化了語法分析器的設(shè)計和實現(xiàn),提高了解析器的效率。本發(fā)明還是一種基于回溯自動機(jī)語法分析的JSAX解析方法,在基于回溯自動機(jī)語法分析的JSAX解析器上進(jìn)行解析,在對XML文檔進(jìn)行解析過程中,參見圖5,具體解析步驟包括步驟I.首先在開始時由詞法分析器讀取XML文檔中的XMLDecl記號,對XMLDecl進(jìn)行解析,判斷是否符合XMLDecl規(guī)范,對于符合規(guī)范的XMLDecl繼續(xù)進(jìn)行解析,對于不符合的直接報告錯誤;步驟2.符合規(guī)范的XMLDecl,判斷下一個記號是否有Miscs存在,如果有,對 Miscs循環(huán)進(jìn)行解析;步驟3.解析完Miscs后,判斷下一個記號是否為doctypedecl,如果是,進(jìn)行步驟4,否則進(jìn)行步驟5 ;步驟4.解析doctypedecl,解析完doctypedecl之后,判斷下一個記號是否為Miscs,如果是則對Miscs循環(huán)進(jìn)行解析;否則轉(zhuǎn)向步驟6 ;步驟5.解析完doctypedecl后,判斷下一個記號是不是空元素標(biāo)記,若不是空元素標(biāo)記則進(jìn)入步驟6 ;若是則對空元素標(biāo)記進(jìn)行解析,然后進(jìn)入步驟10 ;步驟6.判斷下一個記號是否為開始標(biāo)記,如果是,對開始標(biāo)記進(jìn)行解析,并將當(dāng)前狀態(tài)壓入狀態(tài)棧的棧頂,將開始標(biāo)記名壓入名字棧棧頂;否則報錯。步驟7.如果下一個記號是不需要進(jìn)行入棧操作的記號,如CharData, CDSection,Comment, Reference, PI, EmptyElemTag, S,分別對相應(yīng)記號進(jìn)行解析,繼續(xù)下一步;如果下一個記號是開始標(biāo)記STag,則轉(zhuǎn)向步驟6 ;步驟8.判斷下一個記號是否為結(jié)束標(biāo)記,若是,對結(jié)束標(biāo)記進(jìn)行解析,彈出狀態(tài)棧棧頂狀態(tài),作為自動機(jī)的下一狀態(tài),同時彈出名字棧棧頂記號,判斷該記號是否與當(dāng)前的結(jié)束標(biāo)記名相同,如果相同則進(jìn)入下一步,否則表明開始標(biāo)記與結(jié)束標(biāo)記不匹配,報告錯誤;步驟9.解析完一個結(jié)束標(biāo)記后檢查狀態(tài)棧是否為空,若為空則進(jìn)行步驟10,否則轉(zhuǎn)向步驟7 ;步驟10.判斷文檔是否還有記號,如果沒有,表明已經(jīng)讀到XML文檔末尾,解析結(jié)束;如果文檔還有記號,則判斷下一個記號是不是Miscs,若不是則報告錯誤,若是則對Miscs記號進(jìn)行解析,直到讀到XML文檔的末尾,完成對整個XML文檔的解析過程,解析結(jié)束。本發(fā)明不但給出了基于回溯自動機(jī)語法分析JSAX解析器,以及回溯自動機(jī)的文法本發(fā)明還給出了在解析一個XML文檔時的具體解析過程和步驟,同下推自動機(jī)實現(xiàn)的語法分析器相比,本發(fā)明的解析步驟得到了很大的簡化。本發(fā)明由于采用了改進(jìn)的回溯自動機(jī)進(jìn)行語法分析,同遞歸下降子程序和下推自動機(jī)實現(xiàn)的語法分析器相比較,效率上有了明顯的提聞。實施例2基于回溯自動機(jī)語法分析的JSAX解析器和解析方法同實施例1,從解析器的構(gòu)成角度,再對本發(fā)明進(jìn)行詳細(xì)說明。本發(fā)明的基于回溯自動機(jī)語法分析的JSAX解析器主要包括詞法分析器、語法分析器、事件處理器幾個部分?;诨厮葑詣訖C(jī)語法分析JSAX解析器詞法分析器的設(shè)計與實現(xiàn)由于FA易于構(gòu)造、分析效率高的優(yōu)點(diǎn),所以FA被廣泛應(yīng)用于詞法分析器的設(shè)計。本發(fā)明JSAX解析器,是一種用Java實現(xiàn)的基于SAX接口的XML文檔解析器,JSAX解析器也是通過構(gòu)造FA進(jìn)行詞法分析。
參照附圖4,詞法分析器負(fù)責(zé)讀取XML文檔的內(nèi)容,詞法分析器的實現(xiàn)需要構(gòu)造有限自動機(jī),通過有限自動機(jī)讀取XML文檔中的字符或者字符串,以記號流的方式傳輸給語法分析器。根據(jù)XML規(guī)范產(chǎn)生式中與詞法分析相關(guān)的產(chǎn)生式繪制狀態(tài)轉(zhuǎn)移圖,根據(jù)得到的狀態(tài)轉(zhuǎn)換圖進(jìn)行編碼。在進(jìn)行識別各種記號時,需要構(gòu)造識別相應(yīng)記號的有限自動機(jī),然后根據(jù)有限自動機(jī)是否能接受該記號來判斷一個記號是不是符號相應(yīng)的XML規(guī)范,詞法分析器讀取當(dāng)前字符為ch,構(gòu)造詞法分析器的有限自動機(jī)具體過程包括有a.構(gòu)造讀取單個字符的有限自動機(jī)XML規(guī)范中描述單個字符的產(chǎn)生式為[2]Char:: = #x9|#xA|#xD [#x20_xD7FF]|[#xE000-#xFFFD]|[#xl0000-#xl0FFFF]。參見附圖4(a),是讀取單個字符的有限自動機(jī)對應(yīng)的狀態(tài)轉(zhuǎn)移圖,根據(jù)產(chǎn)生式[2]構(gòu)造讀取單個字符的自動機(jī),具體過程是在開始狀態(tài)讀取一個字符ch,如果該字符是XML規(guī)范產(chǎn)生式[2]的字符,轉(zhuǎn)移到終態(tài)接受該字符,否則報錯。b.構(gòu)造讀取名字類記號的有限自動機(jī)XML規(guī)范中描述名字類記號的產(chǎn)生式有[4]、[4a]、[5][4]NameStart:: = [A-Z]I" | [a_z] Extender[4a] NameChar: : = NameStart " : " | " \" . " |
CombingChar[5]Name: : = NameStart (NameChar) *參見附圖4 (b),是讀取名字類記號的有限自動機(jī)對應(yīng)的狀態(tài)轉(zhuǎn)移圖,JSAX解析器中詞法分析器讀取合法名字類的記號的具體過程是步驟BI.首先,在開始狀態(tài)Stl讀取一個字符,判斷該字符是不是合法的NameStart,即判斷名字記號的開始符號,若是則進(jìn)行步驟2,否則進(jìn)入步驟3 ;步驟B2.在S1狀態(tài)下循環(huán)讀取名字NameChar字符,循環(huán)讀取,直到讀入的字符不是NameChar字符為止,進(jìn)入結(jié)束狀態(tài),成功返回;步驟B3.報告出錯,讀入非法的名字記號并返回。c.構(gòu)造讀取開始標(biāo)記STag記號的有限自動機(jī)XML規(guī)范描述開始標(biāo)記記號的產(chǎn)生式為[40]STag:: = 〈Name(S Attribute)*S >
[41]Attribute:: = Name Eq AttValue參見附圖4(c),是讀取開始標(biāo)記記號的有限自動機(jī)對應(yīng)的狀態(tài)轉(zhuǎn)移圖,讀取STag的具體步驟包括如下幾個步驟步驟Cl.在開始狀態(tài)Stl,讀取一個字符,若該字符是‘〈’則轉(zhuǎn)向步驟2 ;步驟C2.在S1狀態(tài)讀取標(biāo)簽的名字;步驟C3.在S2狀態(tài)讀取字符,若下一個字符是‘〉’,則轉(zhuǎn)向S3狀態(tài),成功接受并返回;若下一個字符是空白字符Space,則進(jìn)入步驟4 ;步驟C4.在S4狀態(tài)讀取字符,若下一個字符為‘〉’,則進(jìn)入終態(tài),成功接受該記號并返回,否則若下一個記號為名字Name記號則轉(zhuǎn)向步驟5 ;
步驟C5.在S6狀態(tài)讀取字符,如下一個字符為‘ = ’,則轉(zhuǎn)向步驟6 ;步驟C6.在S7狀態(tài)讀取下一個記號,如果該記號為屬性值A(chǔ)ttValue記號則轉(zhuǎn)向步驟2 ;d.構(gòu)造讀取結(jié)束標(biāo)記ETag的有限自動機(jī)XML規(guī)范中描述結(jié)束標(biāo)記的產(chǎn)生式[5]Name:: = NameStartChar(NameChar) *[42]ETag: : 〈/' NameS ' >'參見附圖4(d),是讀取結(jié)束標(biāo)記記號的有限自動機(jī)對應(yīng)的狀態(tài)轉(zhuǎn)移圖,讀取ETag的具體步驟如下步驟Dl.讀取‘〈’;步驟D2.讀取 ‘/’;步驟D3.讀取名字開始字符NameStart ;步驟D4.讀取一個字符,若該字符為‘〉’,則進(jìn)入結(jié)束狀態(tài),表明讀取ETag記號成功;否則轉(zhuǎn)向步驟5;步驟D5.如果下一個字符為空白字符,則再讀取字符,知道該字符不是空白字符為止,如果該字符是‘〉’,則進(jìn)入結(jié)束狀態(tài),表明讀取ETag成功。詞法分析器中都是通過構(gòu)造有限自動機(jī)來完成對各類記號的識別的,此處按照XML規(guī)范中的產(chǎn)生式,給出識別開始標(biāo)記STag記號、結(jié)束標(biāo)記ETag記號的有限自動機(jī)的構(gòu)造過程,對于其它記號的識別也是按照XML規(guī)范中的產(chǎn)生式,通過構(gòu)造有限自動機(jī)來完成對記號的識別的過程是類似的,此處不再一一列出。實施例3基于回溯自動機(jī)語法分析JSAX解析器的構(gòu)成以及語法規(guī)則同實施例1-2,基于回溯自動機(jī)語法分析JSAX解析方法同實施例1-2。結(jié)合附圖詳細(xì)說明對回溯自動機(jī)具體的改進(jìn)。本發(fā)明的語法分析器基于回溯自動機(jī),回溯自動機(jī)的定義為一個確定的回溯自動機(jī)DTA由五元組組成,M = (S, Σ , 3,qQ,F(xiàn)),其中,M表示構(gòu)造的回溯自動機(jī);S = {S。,S1,…,SJ是非空的狀態(tài)集合;Σ是輸入字符集;q(les是初始狀態(tài);
FgS是終止?fàn)顟B(tài)的非空集合;δ 是 SX Σ— S U {trace}上的映射?;厮葑詣訖C(jī)由輸入帶、狀態(tài)棧以及有限控制器構(gòu)成,初始時,讀頭指向輸入帶最左端符號,狀態(tài)棧為空,有限控制器處于狀態(tài)%,在運(yùn)行的每一步,有限控制器根據(jù)當(dāng)前狀態(tài)q和讀頭所指向的記號a根據(jù)狀態(tài)轉(zhuǎn)移函數(shù)δ來確定轉(zhuǎn)移動作,狀態(tài)轉(zhuǎn)移函數(shù)存在下邊幾種情況(3. I. I)若δ (q,a) = p,則將狀態(tài)q壓入棧頂,控制轉(zhuǎn)向p,讀頭右移一位(稱為進(jìn)棧規(guī)則);(3. 1.2)若δ (q,a) = trace,且棧不空,則控制轉(zhuǎn)向棧頂狀態(tài)p,并且p退棧,讀頭右移一位(稱為回溯規(guī)則);若棧空,則停機(jī)并拒絕接受;
(3.1.3)若a是空白字符(空白字符不屬于輸入字符集,表示字符串結(jié)束),則停機(jī)并且在q e F時接受輸入字符串,在q E F時拒絕接受;(3. I. 4)若δ (q,a)無定義,則停機(jī)并拒絕接受輸入字符串。上述的回溯自動機(jī)能夠識別括號配對串語言,但是XML語言中除了類似于括號的標(biāo)記以外還有很多其它的不要求配對的字符數(shù)據(jù),上述的回溯自動機(jī)對讀頭所指向的記號a沒有進(jìn)行分類,記號a泛指讀頭所指向的記號,并且上述的回溯自動機(jī)不能夠識別像XML這樣的語言,因此需要對上述的回溯自動機(jī)進(jìn)行改進(jìn),本發(fā)明將回溯自動機(jī)的4條規(guī)則重新改為如下5條規(guī)則,并且對讀頭所指向的記號分為a、b、C、d、e五類I)若δ (q,a) = p,即當(dāng)讀入記號a時,將當(dāng)前狀態(tài)q壓入棧頂,將a稱作需要進(jìn)行入棧操作的記號;2)若δ (q,b) = trace,即當(dāng)讀入記號b時,并前狀態(tài)棧不為空時,彈出棧頂p,并且自動機(jī)轉(zhuǎn)向P狀態(tài),將b稱作需要進(jìn)行回溯的記號;3)若δ (q,c) = p,即當(dāng)讀入記號c時,不需要進(jìn)行棧操作,將c稱作不需要進(jìn)行棧操作的記號;本發(fā)明通過引入該規(guī)則后使得改進(jìn)的回溯自動機(jī)能夠識別XML這樣的具有嵌套的層次結(jié)構(gòu)的標(biāo)記配對串語言,提高了回溯自動機(jī)的識別能力。4)若δ (q,d),若d是空白字符(空白字符不屬于輸入字符集,表示字符串結(jié)束),則停機(jī)并且在q e F時接受輸入字符串,在qiiF時拒絕接受是空白字符,無定義,則停機(jī)并拒絕接受輸入字符串;5)若δ (q,e),無定義,則停機(jī)并拒絕接受輸入字符串。本發(fā)明不但對回溯自動機(jī)進(jìn)行了改進(jìn),增強(qiáng)了回溯自動機(jī)的識別能力,并且給出了與改進(jìn)回溯自動機(jī)等價的文法,使得回溯自動機(jī)既有規(guī)則又有文法,有效的擴(kuò)展了其應(yīng)用性。實施例4基于回溯自動機(jī)語法分析JSAX解析器和解析方法同實施例1-3,基于回溯自動機(jī)語法分析JSAX解析器語法分析器的具體設(shè)計與實現(xiàn)JSAX解析器是一種基于SAX接口的XML解析器,JSAX解析器通過引入改進(jìn)的回溯自動機(jī)來完成對XML文檔的語法分析。(一)構(gòu)造描述XML文檔的語法根據(jù)XML規(guī)范中對文檔定義的產(chǎn)生式包括有
[I]document:: = prolog element Misc*開始符號為document,需要做推導(dǎo)的符號是小寫字母開頭的prolog和element。根據(jù)XML語法的定義,用prolog和element的產(chǎn)生式代替其符號。首先,對prolog的產(chǎn)生式進(jìn)行變換最初的描述XML文檔的產(chǎn)生式如下
[I]document:: = prolog element Misc*[22]prolog:: = XMLDecl Misc*(doctypedecl Misc*) [28] doctypedecl: : = , 〈 ! D0CTYPE 1 S Name (S External ID) S ('[,intSubset, ] ' S ) ' V[28b]intSubset:: = (markupdecl|DeclSep)*[29]markupdecl:: = elementdecI|AttlistDecl|EntityDecl|NotationDecl|Pi|Comment[45] elementdecl: : =' < ! ELEMENT' S Name S contentspec S ' V[46]contentspec:: = ' EMPTY' \ ' ANY' |Mixed |children[47] children: : = (choice | seq) (, 1 | ,| , +' ) [48] cp: : = (Name | choice | seq) (1 1 \ 1| 1 +' ) [49] choice: : = ! (, S cp (S ! \ ! S cp)+S ! ) ![50] seq: : =1 (f S cp (S 1,1 S cp)*S 1 ) 1產(chǎn)生式doctypedecl可以變換成doctypedecl::='〈丨 D0CTYPE 1 S Name (S ExtemalID) S (f [f(elementdeclIAttlistDecl|EntityDecl|NotationDecl|PI|Comment|DeclSep)*,]丨s ) ' y根據(jù)XML規(guī)范的說明,規(guī)范產(chǎn)生式中以大寫字母開頭的符號都是正則語言,doctypedecl中的項只有elementdecl是非正則的,因為elementdecl中的choice和cp的表達(dá)式引用cp,而cp的表達(dá)式中引用choice和seq,由此構(gòu)成遞歸定義。也就無法用有限狀態(tài)確定是否到了解析開始時的cp之后的符號'I !;然而,contentspec是用于描述對元素結(jié)構(gòu)的“有效性”限制,本發(fā)明屬于標(biāo)準(zhǔn)XML解析器,不需要進(jìn)行有效性驗證,也就是說不需要關(guān)心contentspec中的具體內(nèi)容,所以,可把contentspec作為簡單字符串處理,將contentspec產(chǎn)生式改為contentspec: : = [">]*只要求contentspec中的內(nèi)容不包含標(biāo)記結(jié)束符號'V。這樣contentspec就成為了正則文法。釆用右遞歸定義取代運(yùn)算,與空字符的“或”取代“? ”運(yùn)算,對prolog進(jìn)行等價變換[22]prolog:: = XMLDecl Misc*(doctypedecl Misc*) 等價變換為prolog:: = (XMLDecl| ε)Miscs(doctypedecl Miscs| ε)
Miscs: : =Misc Miscs | ε這樣,prolog的表達(dá)式也成為了正則文法。對element產(chǎn)生式進(jìn)行變換[39]element:: = EmptyElemTag|STag content ETag[43]content:: = CharData ((element|Reference|CDSect|PI|Comment)CharData ) *利用產(chǎn)生式CharData ((other) CharData )*:: = (CharData | other) *,將content變換為 content:: = (element|Reference|CDSect|PI|Comment|CharData)content| ε然后將element:: = EmptyElemTag | STag content ETag 代入 content,得到content:: = (STag content ETag|EmptyElemTag|Reference|CDSect|PI|Comment|CharData)content| ε為了以后表達(dá)方便,本發(fā)明弓丨入非終結(jié)符Content—item,設(shè)Content—item: : = EmptyElemTag | Reference | CDSect | PI | Comment | CharData 所以element和content產(chǎn)生式變換為element:: = EmptyElemTag|STag content ETagcontent:: = (STag content ETag|Content_item)content| ε其中,element表示出現(xiàn)在XML文檔中的元素。element或者是一個EmptyElemTag (空標(biāo)記);或者是非空標(biāo)記,非空標(biāo)記是由STag、ETag以及出現(xiàn)在開始標(biāo)記和結(jié)束標(biāo)記之間的content所組成的串。content是非空標(biāo)記或者Content—item組成的序列,并且content描述的序列中含有相同個數(shù)的開始標(biāo)記和結(jié)束標(biāo)記,并且這些表示標(biāo)記和結(jié)束標(biāo)記必須正確的嵌套和匹配。本發(fā)明用與改進(jìn)回溯自動機(jī)等價的文法對element的語法規(guī)則重新進(jìn)行描述document: : = prolog element Miscselement: : = EmptyElemTag|AA: : = STag B AContent—item:: = CharData|Reference|CDSect|PI|Comment|EmptyElemTagB: : = Content—item BB: : = STag B BB: : = ETagA: : = Miscs其中,document表示XML文檔;prolog用來描述聲明信息及文檔類型聲明doctypedecl ;element描述的是嵌套的具有層次結(jié)構(gòu)的標(biāo)記匹配串,要求出現(xiàn)在element中的標(biāo)記必須正確嵌套和匹配;STag表示開始標(biāo)記;CharData表示字符數(shù)據(jù);Reference表示引用KDSect表示CDATA段;PI表示處理指令;Comment表示注釋;EmptyElemTag表示空元素標(biāo)記;STag表示開始標(biāo)記;Misc*表示XML文檔中的空白、處理指令及;B是一個非終結(jié)符,可以替換為結(jié)束標(biāo)記ETag或者STag B B ;A是一個非終結(jié)符,可以替換為Miscs或者STag B A0最后,對Misc的產(chǎn)生式
Misc: : = Comment IPII S,可知Misc可以用正則表達(dá)式進(jìn)行描述。綜上可知,對于一個XML文檔document::=prolog element Misc*,其中prolog為正則文法;element是可以用改進(jìn)回溯自動進(jìn)行描述的文法;Misc*為正則文法。而正則文法是與改進(jìn)回溯自動機(jī)等價文法的子集。根據(jù)自動機(jī)理論,可以構(gòu)造改進(jìn)回溯自動機(jī),來識別XML文檔記號流中的語言結(jié)構(gòu),完成對XML文檔的語法分析。(二).構(gòu)造回溯自動機(jī),本發(fā)明中回溯為改進(jìn)回溯自動機(jī),進(jìn)行語法分析在(一)中描述XML文檔的語法可以用與改進(jìn)回溯自動機(jī)等價的文法進(jìn)行描述,所以構(gòu)造改進(jìn)回溯自動機(jī)來完成對XML文檔的語法分析。為了檢查開始標(biāo)簽和結(jié)束標(biāo)簽是否匹配的問題,還需要設(shè)置一個名字棧,在遇到開始標(biāo)簽時將STag的名字壓入名字棧棧頂,在遇到結(jié)束標(biāo)簽ETag時彈出名字棧棧頂符號同ETag的名字作比較,如果兩者不同則報告標(biāo)簽不匹配錯誤;對于其他標(biāo)簽和記號則不需要進(jìn)行棧操作。 參照附圖1,構(gòu)造的用于XML語法分析的回溯自動機(jī)TA M= (S, Σ , 3,q0,F(xiàn)),其中,表示狀態(tài)集合S {S。,S1, S2, S3, trace};
權(quán)利要求
1.一種基于回溯自動機(jī)語法分析的JSAX解析器,在Eclipse環(huán)境下對XML文檔解析,包括詞法分析器,語法分析器和事件處理器,詞法分析器負(fù)責(zé)讀取XML文檔的內(nèi)容,將讀取的記號輸出給語法分析器,語法分析器根據(jù)XML規(guī)范要求識別輸入記號流中的語言結(jié)構(gòu),將相應(yīng)的事件信息傳遞給事件處理器,事件處理器接受解析器傳遞的所有事件信息并處理,從中發(fā)現(xiàn)所需數(shù)據(jù),實現(xiàn)對XML文檔的解析,并給出解析結(jié)果,其中語法分析器是基于自動機(jī)構(gòu)造的,自動機(jī)中回溯自動機(jī)的結(jié)構(gòu)為五元組,結(jié)構(gòu)為M = (S, E , S,q(l,F(xiàn)),還包含有一個狀態(tài)棧用來保存運(yùn)行的部分歷史,其特征在于所述語法分析器是基于回溯自動機(jī)來實現(xiàn)的,所述回溯自動機(jī)是改進(jìn)回溯自動機(jī),具體是對回溯自動機(jī)的動作轉(zhuǎn)移規(guī)則S重新定義,該定義為規(guī)則性定義,包括 1)若5(q,a) = p,即在狀態(tài)q下,當(dāng)讀入記號a時,將當(dāng)前狀態(tài)q壓入棧頂,其中a代表需要進(jìn)行入棧動作的記號; 2)若S(q,b) = trace,即在狀態(tài)q下,當(dāng)讀入記號b時,并且狀態(tài)棧不為空時,彈出狀態(tài)棧棧頂P,并且控制轉(zhuǎn)向P狀態(tài),其中b代表需要進(jìn)行回溯動作的記號; 3)若5(q,c) = p,即在狀態(tài)q下,當(dāng)讀入記號c時,不需要進(jìn)行棧操作,其中c代表不需要進(jìn)行棧操作的記號; 4)若5(q,d),若d是空白字符(空白字符不屬于輸入字符集,表示字符串結(jié)束),則停機(jī)并且在q G F時接受輸入字符串,在F時拒絕接受; 5)若5(q, e)無定義,則停機(jī)并拒絕接受輸入字符串。
2.根據(jù)權(quán)利要求I所述的基于回溯自動機(jī)語法分析的JSAX解析器,其特征在于與改進(jìn)回溯自動機(jī)相等價的文法形式為A 一 a 3 其中a e T (a屬于終結(jié)符T),P G {N° U N1 U N2K^是零個、一個或者兩個非終結(jié)符N的串);并且當(dāng)P中含有兩個非終結(jié)符時,產(chǎn)生式的結(jié)構(gòu)為A — aCA,該結(jié)構(gòu)要求產(chǎn)生式右部第二個非終結(jié)符和產(chǎn)生式左邊的非終結(jié)符相同,其中A、C是非終結(jié)符; 該文法的描述能力比正規(guī)文法RG強(qiáng),但比上下文無關(guān)文法CFG弱,是CFG的子集,介于RG與CFG之間。
3.根據(jù)權(quán)利要求2所述的基于回溯自動機(jī)語法分析的JSAX解析器,其特征在于用與改進(jìn)回溯自動機(jī)等價的文法來描述XML語法定義,得到描述XML文檔的語法規(guī)則,根據(jù)這些語法規(guī)則構(gòu)造改進(jìn)回溯自動機(jī),用改進(jìn)回溯自動機(jī)識別XML文檔記號流中的語言結(jié)構(gòu),判斷是否符合語法規(guī)范,完成語法分析,同時將相應(yīng)事件信息傳遞給事件處理器。
4.根據(jù)權(quán)利要求3所述的基于回溯自動機(jī)語法分析的JSAX解析器,其特征在于用權(quán)利要求2所述的文法形式構(gòu)建用于描述XML語法定義的語法規(guī)則包括document:: = prolog element Misc*element:: = EmptyElemTag|AA: : = STag B AContent_item:: = CharData|Reference|CDSect|PI|Comment|EmptyElemTagB:: = Content—item BB: : = STag B BB: : = ETagA: : = MiscsMiscs:: = e IMisc Miscs 其中,document表示XML文檔;prolog用來描述聲明信息及文檔類型聲明doctypedecl ;element描述的是嵌套的具有層次結(jié)構(gòu)的標(biāo)記匹配串,要求出現(xiàn)在element中的標(biāo)記必須正確嵌套和匹配;STag表示開始標(biāo)記;CharData表示字符數(shù)據(jù)!Reference表示引用;Q)Sect表示CDATA段;PI表示處理指令;Comment表示注釋;EmptyElemTag表示空元素標(biāo)記;STag表示開始標(biāo)記;Misc*表示XML文檔中的空白、處理指令及注釋;B是一個非終結(jié)符,可以替換為結(jié)束標(biāo)記ETag或者STag B B ;A是一個非終結(jié)符,可以替換為Miscs或者 STag B A0
5.根據(jù)權(quán)利要求4所述的基于回溯自動機(jī)語法分析的JSAX解析器,其特征在于根據(jù)描述XML語法定義的語法規(guī)則,構(gòu)造改進(jìn)回溯自動機(jī),用改進(jìn)回溯自動機(jī)讀取來自詞法分析器輸出的XML文檔中的記號流中的語言結(jié)構(gòu),完成語法分析,所構(gòu)造的改進(jìn)回溯自動機(jī) TA為:M= (S, E,S,q。,F(xiàn)),其中 狀態(tài)集合S {S0, S1, S2, S3, trace},其中Stl表示解析開始狀態(tài),S1表示解析完XMLDecl之后的狀態(tài),S2解析完doctypedecl之后到達(dá)的狀,S3解析完根元素STag之后開始解析content的狀態(tài),trace表示解析完一個ETag需要進(jìn)入回溯狀態(tài)。
輸入符號集合E{XMLDecI,Misc,doctypedecl,EmptyElemTag, STag, Reference, CDSect, CharData, PI,CDSection, Comment, ETag};開始狀態(tài)Qtl =Stl ; 終態(tài)集FdSpS2I ; 狀態(tài)棧stack (S1, S2, S3, Z};(其中Z表示棧底) 轉(zhuǎn)移函數(shù)S,S :SX E—S U {trace},是下列轉(zhuǎn)移的集合 (1)(S0, XMLDecl) = S1 :在開始狀態(tài),讀入記號為XML聲明XMLDecl,則轉(zhuǎn)移到S1狀態(tài); (2)(SljMisc) = S1 :在S1W態(tài)讀入記號為Misc (即空白字符、注釋或者處理指令),則循環(huán)讀取記號Misc ; (3)(S1, STag) = S3 :在S1狀態(tài)讀入記號為開始標(biāo)記STag,則將當(dāng)前狀態(tài)S1壓入狀態(tài)棧棧頂,將開始標(biāo)記名壓入名字棧棧頂,轉(zhuǎn)移到S3狀態(tài);(4)(S1, doctypedecl) = S2 :在 S1 狀態(tài)讀入記號為 doctypedecl,轉(zhuǎn)到 S2 狀態(tài); (5)(S2, Misc) = S2 :在S2狀態(tài)讀入記號為Misc (空白字符、注釋或者處理指令)則循環(huán)解析Misc,狀態(tài)棧不改變; (6)(S2,STag) = S3 :在S2狀態(tài)讀入記號為開始標(biāo)記STag,將開始標(biāo)記名壓入名字棧棧頂,將當(dāng)前狀態(tài)S2ffi入狀態(tài)棧棧頂,轉(zhuǎn)移到S3狀態(tài); (7)(S3, Content_item) = S3 :循環(huán)讀取不需入棧的記號,狀態(tài)棧不改變; (8)(S3, STag) = S3 :在S3狀態(tài)讀入記號為開始標(biāo)記STag,將當(dāng)前狀態(tài)S3壓入狀態(tài)棧棧頂,將開始標(biāo)記名壓入名字棧棧頂; (9)(S3, ETag) = trace :在S3狀態(tài)讀入記號為結(jié)束標(biāo)記ETag,則轉(zhuǎn)向狀態(tài)棧棧頂狀態(tài)P,并且彈出狀態(tài)棧棧頂P,同時彈出名字棧棧頂記號與ETag標(biāo)記的名字進(jìn)行對比,如果相同,表明標(biāo)記正確匹配,否則報告錯誤。
6.一種基于回溯自動機(jī)語法分析的JSAX解析方法,使用權(quán)利要求1-5的基于回溯自動機(jī)語法分析的JSAX解析器,在Eclipse環(huán)境下對XML文檔進(jìn)行解析,其特征在于,在對XML文檔進(jìn)行解析過程中,具體解析步驟包括 步驟I.首先在開始時由詞法分析器讀取XML文檔中的XMLDecl記號,對XMLDecl進(jìn)行解析,判斷是否符合XMLDecl規(guī)范,對于符合規(guī)范的XMLDecl繼續(xù)進(jìn)行解析,對于不符合的直接報告錯誤; 步驟2.符合規(guī)范的XMLDecl,判斷下一個記號是否有Miscs存在,如果有,對Miscs循環(huán)進(jìn)行解析; 步驟3.解析完Miscs后,判斷下一個記號是否為doctypedecl,如果是,進(jìn)行步驟4,否則進(jìn)行步驟5 ; 步驟4.解析doctypedecl,解析完doctypedecl之后,判斷下一個記號是否為Miscs,如果是則對Miscs循環(huán)進(jìn)行解析;否則轉(zhuǎn)向步驟6 ; 步驟5.解析完doctypedecl后,判斷下一個記號是不是空元素標(biāo)記,若不是空元素標(biāo)記則進(jìn)入步驟6 ;若是則對空元素標(biāo)記進(jìn)行解析,然后進(jìn)入步驟10 ; 步驟6.判斷下一個記號是否為開始標(biāo)記,如果是,對開始標(biāo)記進(jìn)行解析,并將當(dāng)前狀態(tài)壓入狀態(tài)棧的棧頂,將開始標(biāo)記名壓入名字棧棧頂;否則報錯; 步驟7.如果下一個記號是不需要進(jìn)行入棧操作的記號,如CharData,⑶Section,Comment, Reference, PI, EmptyElemTag, S,分別對相應(yīng)記號進(jìn)行解析,繼續(xù)下一步;如果下一個記號是開始標(biāo)記STag,貝U轉(zhuǎn)向步驟6 ; 步驟8.判斷下一個記號是否為結(jié)束標(biāo)記,若是,對結(jié)束標(biāo)記進(jìn)行解析,彈出狀態(tài)棧棧頂狀態(tài),作為自動機(jī)的下一狀態(tài),同時彈出名字棧棧頂記號,判斷該記號是否與當(dāng)前的結(jié)束標(biāo)記名相同,如果相同則進(jìn)入下一步,否則表明開始標(biāo)記與結(jié)束標(biāo)記不匹配,報告錯誤;步驟9.解析完一個結(jié)束標(biāo)記后檢查狀態(tài)棧是否為空,若為空則進(jìn)行步驟10,否則轉(zhuǎn)向步驟7 ; 步驟10.判斷文檔是否還有記號,如果沒有,表明已經(jīng)讀到XML文檔末尾,解析結(jié)束;如果文檔還有記號,則判斷下一個記號是不是Miscs,若不是則報告錯誤,若是則對Miscs記號進(jìn)行解析,直到讀到XML文檔的末尾,完成對整個XML文檔的解析過程,解析結(jié)束。
全文摘要
本發(fā)明是一種基于回溯自動機(jī)語法分析的JSAX解析器和解析方法。通過對回溯自動機(jī)的動作轉(zhuǎn)移規(guī)則δ重新定義,并將改進(jìn)回溯自動機(jī)應(yīng)用于語法分析器,簡化了語法分析器的設(shè)計和實現(xiàn),有效提高了XML解析器的效率。在進(jìn)行語法分析時,回溯自動機(jī)以詞法分析器提供的記號流為輸入,當(dāng)回溯自動機(jī)讀入的記號為開始標(biāo)記時,則將當(dāng)前狀態(tài)壓入棧頂;讀入記號為結(jié)束標(biāo)記時則自動機(jī)從棧頂彈出一個狀態(tài),并作為自動機(jī)的下一狀態(tài);在遇到其他記號時則不進(jìn)行棧操作。語法分析的同時,通過標(biāo)準(zhǔn)的回調(diào)函數(shù)將符合語法規(guī)范的XML文檔信息返回給用戶。本發(fā)明解決了XML文檔解析器語法分析器構(gòu)造復(fù)雜,性能不高的問題,具有易于實現(xiàn)、效率高的特點(diǎn),可應(yīng)用于對XML文檔的解析。
文檔編號G06F17/30GK102708155SQ201210118808
公開日2012年10月3日 申請日期2012年4月20日 優(yōu)先權(quán)日2012年4月20日
發(fā)明者張柯柯, 段振華, 王小兵, 田聰 申請人:西安電子科技大學(xué)