本公開(kāi)涉及協(xié)議解析領(lǐng)域,具體地,涉及一種協(xié)議數(shù)據(jù)解析方法、裝置和系統(tǒng)。
背景技術(shù):
::網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)通信的基礎(chǔ),協(xié)議解析是對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的各個(gè)部分按照協(xié)議規(guī)范進(jìn)行分析,得到數(shù)據(jù)包準(zhǔn)確且詳細(xì)的信息,用于協(xié)議之上各種網(wǎng)絡(luò)功能。隨著網(wǎng)絡(luò)應(yīng)用的日益繁多,網(wǎng)絡(luò)協(xié)議的數(shù)量也呈現(xiàn)爆炸式增長(zhǎng),使得采用人工編碼的方式解析協(xié)議變得費(fèi)時(shí)費(fèi)力。為了提高協(xié)議解析的靈活性和工程化效率,出現(xiàn)了基于編譯技術(shù)的協(xié)議解析方法?,F(xiàn)有技術(shù)中,基于編譯技術(shù)的協(xié)議數(shù)據(jù)分析為將協(xié)議數(shù)據(jù)輸入詞法分析器進(jìn)行匹配后,然后將詞法分析器的輸出結(jié)果送給語(yǔ)法分析器,以根據(jù)狀態(tài)機(jī)的狀態(tài)進(jìn)行協(xié)議解析。對(duì)于相對(duì)復(fù)雜的協(xié)議,詞法分析器的模式串?dāng)?shù)量大且模式特征過(guò)于復(fù)雜,同時(shí)存在精確串和正則串,難以選擇高效的多模匹配算法。另外,如果詞法分析器產(chǎn)生變化,會(huì)改變語(yǔ)法分析的輸入符號(hào)序列,可能會(huì)影響語(yǔ)法分析中的任何產(chǎn)生式,難以進(jìn)行擴(kuò)展。技術(shù)實(shí)現(xiàn)要素:本公開(kāi)的目的是提供一種快速準(zhǔn)確、易擴(kuò)展的協(xié)議數(shù)據(jù)解析方法、裝置和系統(tǒng)。為了實(shí)現(xiàn)上述目的,根據(jù)本公開(kāi)的第一方面,提供一種協(xié)議數(shù)據(jù)解析方法,包括:接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂;將所述待匹配的協(xié)議數(shù)據(jù)輸入至與所述當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器;將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器;接收所述詞法分析器的返回結(jié)果;在所述返回結(jié)果為帶謂詞的終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述帶謂詞的終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件,其中,所述帶謂詞的終結(jié)符號(hào)包括所述協(xié)議的終結(jié)符號(hào)和所述詞法分析器匹配到的模式串;在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作,返回所述將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器的步驟。可選地,所述方法還包括:在確定產(chǎn)生規(guī)約事件時(shí),執(zhí)行規(guī)約操作,并返回所述將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器的步驟。可選地,所述方法還包括:在所述返回結(jié)果為非終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件或是接受事件;在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作;根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件;在判定能繼續(xù)產(chǎn)生規(guī)約事件時(shí),返回所述將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器的步驟;在判定不能繼續(xù)產(chǎn)生規(guī)約事件時(shí),返回所述接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂?shù)牟襟E,其中,再次接收的待匹配的協(xié)議數(shù)據(jù)是前次接收的待匹配的協(xié)議數(shù)據(jù)中除去前次已匹配完成的數(shù)據(jù)部分后剩余的數(shù)據(jù)部分。可選地,所述方法還包括:在確定產(chǎn)生規(guī)約事件時(shí),進(jìn)行規(guī)約操作,并返回所述根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件的步驟;在確定產(chǎn)生接受事件時(shí),獲得協(xié)議的目標(biāo)非終結(jié)符號(hào)??蛇x地,所述詞法分析器匹配到的模式串是所述詞法分析器自身自帶的模式串集合中的一者,或者是所述詞法分析器根據(jù)引用標(biāo)識(shí)從引用棧獲取到的模式串,其中,所述引用棧中存儲(chǔ)有至少一個(gè)模式串,所述引用棧能夠被其他詞法分析器訪問(wèn)。根據(jù)本公開(kāi)的第二方面,提供一種協(xié)議數(shù)據(jù)解析裝置,包括:第一接收模塊,用于接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂;第一輸入模塊,用于將所述待匹配的協(xié)議數(shù)據(jù)輸入至與當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器;第二輸入模塊,用于將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器;第二接收模塊,用于接收所述詞法分析器的返回結(jié)果;第一確定模塊,用于在所述返回結(jié)果為帶謂詞的終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述帶謂詞的終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件,其中,所述帶謂詞的終結(jié)符號(hào)包括所述協(xié)議的終結(jié)符號(hào)和所述詞法分析器匹配到的模式串;第一處理模塊,用于在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作,并重新觸發(fā)所述第二輸入模塊將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器??蛇x地,所述裝置還包括:第二處理模塊,用于在確定產(chǎn)生規(guī)約事件時(shí),執(zhí)行規(guī)約操作,并重新觸發(fā)所述第二輸入模塊將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器??蛇x地,所述裝置還包括:第二確定模塊,用于在所述返回結(jié)果為非終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件或是接受事件;第三處理模塊,用于在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作;判斷模塊,用于根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件,在判定能繼續(xù)產(chǎn)生規(guī)約事件時(shí),重新觸發(fā)所述第二輸入模塊將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器,在判定不能繼續(xù)產(chǎn)生規(guī)約事件時(shí),重新觸發(fā)所述第一接收模塊接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂,其中,再次接收的待匹配的協(xié)議數(shù)據(jù)是前次接收的待匹配的協(xié)議數(shù)據(jù)中除去前次已匹配完成的數(shù)據(jù)部分后剩余的數(shù)據(jù)部分。可選地,所述裝置還包括:第四處理模塊,用于在確定產(chǎn)生規(guī)約事件時(shí),進(jìn)行規(guī)約操作,并重新觸發(fā)所述判斷模塊根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件;第五處理模塊,用于在確定產(chǎn)生接受事件時(shí),獲得協(xié)議的目標(biāo)非終結(jié)符號(hào)??蛇x地,所述詞法分析器匹配到的模式串是所述詞法分析器自身自帶的模式串集合中的一者,或者是所述詞法分析器根據(jù)引用標(biāo)識(shí)從引用棧獲取到的模式串,其中,所述引用棧中存儲(chǔ)有至少一個(gè)模式串,所述引用棧能夠被其他詞法分析器訪問(wèn)。根據(jù)本公開(kāi)的第三方面,提供一種協(xié)議數(shù)據(jù)解析系統(tǒng),包括:多個(gè)詞法分析器,所述多個(gè)詞法分析器與語(yǔ)法分析器的多個(gè)狀態(tài)一一對(duì)應(yīng);所述語(yǔ)法分析器,包括控制器、狀態(tài)棧和符號(hào)棧,其中,所述控制器包括上述的協(xié)議數(shù)據(jù)解析裝置。可選地,所述系統(tǒng)還包括:引用棧,用于存儲(chǔ)至少一個(gè)模式串,所述引用棧能夠被所述多個(gè)詞法分析器中的至少兩個(gè)詞法分析器訪問(wèn),以使所述至少兩個(gè)詞法分析器能夠根據(jù)引用標(biāo)識(shí)從所述引用棧獲取相應(yīng)的模式串。通過(guò)上述技術(shù)方案,由于本公開(kāi)中不同的狀態(tài)對(duì)應(yīng)不同的詞法分析器,在不同狀態(tài)下,當(dāng)匹配到相同的模式串時(shí),也可以向語(yǔ)法分析器輸入不同的非終結(jié)符號(hào),相對(duì)獨(dú)立的詞法分析器的變化影響范圍較小,使得詞法分析器的修改和擴(kuò)充更加方便。同時(shí),減少詞法分析器中的模式串的數(shù)量,可以降低詞法分析的復(fù)雜度,使得詞法分析器可以根據(jù)模式串的特點(diǎn)選擇最適宜的模式串匹配算法,從而提高詞法分析的性能。詞法分析器在進(jìn)行模式串匹配時(shí),只需要匹配當(dāng)前狀態(tài)下對(duì)應(yīng)的詞法分析器中歸集的模式串,可以避免產(chǎn)生語(yǔ)法沖突,從而提高協(xié)議數(shù)據(jù)解析的效率和準(zhǔn)確性。本公開(kāi)的其他特征和優(yōu)點(diǎn)將在隨后的具體實(shí)施方式部分予以詳細(xì)說(shuō)明。附圖說(shuō)明附圖是用來(lái)提供對(duì)本公開(kāi)的進(jìn)一步理解,并且構(gòu)成說(shuō)明書的一部分,與下面的具體實(shí)施方式一起用于解釋本公開(kāi),但并不構(gòu)成對(duì)本公開(kāi)的限制。在附圖中:圖1是根據(jù)本公開(kāi)的一種實(shí)施方式提供的協(xié)議數(shù)據(jù)解析方法的流程圖;圖2是根據(jù)本公開(kāi)的另一種實(shí)施方式提供的協(xié)議數(shù)據(jù)解析方法的流程圖;圖3是根據(jù)本公開(kāi)的實(shí)施方式提供的一種協(xié)議數(shù)據(jù)解析裝置的框圖;圖4是根據(jù)本公開(kāi)的一種實(shí)施方式提供的協(xié)議數(shù)據(jù)解析系統(tǒng)的框圖;圖5是根據(jù)本公開(kāi)的一種實(shí)施方式提供的語(yǔ)法分析器的狀態(tài)遷移圖。具體實(shí)施方式以下結(jié)合附圖對(duì)本公開(kāi)的具體實(shí)施方式進(jìn)行詳細(xì)說(shuō)明。應(yīng)當(dāng)理解的是,此處所描述的具體實(shí)施方式僅用于說(shuō)明和解釋本公開(kāi),并不用于限制本公開(kāi)。本協(xié)議數(shù)據(jù)解析系統(tǒng)分為系統(tǒng)開(kāi)發(fā)階段和系統(tǒng)運(yùn)行階段。在系統(tǒng)開(kāi)發(fā)階段采用帶謂詞的上下文無(wú)關(guān)文法定義協(xié)議解析規(guī)則。首先定義描述協(xié)議字段的模式串,對(duì)于復(fù)雜的模式串可以進(jìn)一步分割成多個(gè)模式串,然后將模式串作為協(xié)議的終結(jié)符號(hào)的謂詞,將終結(jié)符號(hào)和模式串作為帶謂詞的終結(jié)符號(hào),定義解析規(guī)則文法的基礎(chǔ)產(chǎn)生式;將協(xié)議字段之間的關(guān)系或協(xié)議字段分割后模式串之間的關(guān)系定義為解析規(guī)則文法的擴(kuò)展產(chǎn)生式。以下,首先介紹系統(tǒng)開(kāi)發(fā)階段,該階段編寫協(xié)議解析規(guī)則。通過(guò)使用帶謂詞的上下文無(wú)關(guān)文法定義該協(xié)議解析規(guī)則文法,規(guī)則文法的基礎(chǔ)產(chǎn)生式定義協(xié)議字段,擴(kuò)展產(chǎn)生式定義協(xié)議字段的語(yǔ)法關(guān)系。文法格式如下:G={VT,VN,S,R,P}。其中,VT為終結(jié)符號(hào)集,即代表待匹配的協(xié)議數(shù)據(jù);VN為非終結(jié)符號(hào)集,即協(xié)議分析產(chǎn)生的各個(gè)協(xié)議字段;S是目標(biāo)文法符號(hào),即協(xié)議解析的目標(biāo)非終結(jié)符號(hào),規(guī)約到S則終止協(xié)議分析;R是文法的產(chǎn)生式集,定義協(xié)議各協(xié)議字段的組合關(guān)系,P是文法的謂詞集,定義描述各個(gè)協(xié)議字段的模式串。首先,將待匹配的協(xié)議數(shù)據(jù)定義為終結(jié)符號(hào),“終結(jié)”代表著不可再細(xì)分,是協(xié)議解析的基礎(chǔ)符號(hào)。如果協(xié)議是在輸入時(shí)需要區(qū)分命令和應(yīng)答,可以定義兩個(gè)終結(jié)符號(hào),分別為命令終結(jié)符號(hào)和應(yīng)答終結(jié)符號(hào)。每個(gè)終結(jié)符號(hào)帶上謂詞為帶謂詞的終結(jié)符號(hào),表示協(xié)議的協(xié)議字段,即如果協(xié)議數(shù)據(jù)匹配上該謂詞,則該謂詞所對(duì)應(yīng)的數(shù)據(jù)匹配范圍的數(shù)據(jù)為該帶謂詞的終結(jié)符號(hào)所表示的協(xié)議字段。對(duì)于描述協(xié)議字段的簡(jiǎn)單模式串,將其定義成基礎(chǔ)產(chǎn)生式,其中產(chǎn)生式右部為帶謂詞的終結(jié)符號(hào)且產(chǎn)生式左部為產(chǎn)生的協(xié)議字段符號(hào),即非終結(jié)符號(hào)。以下以MIME協(xié)議為例:基礎(chǔ)產(chǎn)生式的定義:MIME_Header_From:mime_atom_stream($1~/^From:.*\r\n/i);mime_atom_stream為協(xié)議的終結(jié)符號(hào),“^From.*\r\n”為模式串,其數(shù)據(jù)匹配范圍代表MIME的發(fā)件人首部協(xié)議字段MIME_Header_From。上述產(chǎn)生式為基礎(chǔ)產(chǎn)生式,位于產(chǎn)生式左部的符號(hào)被稱為非終結(jié)符。為了描述多個(gè)協(xié)議單元之間的關(guān)系和更大的協(xié)議字段對(duì)象,協(xié)議解析規(guī)則文法中可以定義擴(kuò)展產(chǎn)生式以描述多個(gè)協(xié)議字段可以組成更大的協(xié)議字段。例如:MIME_Header_Receiver:MIME_Header_ToMIME_Header_Cc;上述擴(kuò)展產(chǎn)生式描述了郵件接收者協(xié)議字段MIME_Header_Receiver是郵件的收件人協(xié)議字段MIME_Header_To和郵件的抄送人協(xié)議字段MIME_Header_Cc的組合。擴(kuò)展產(chǎn)生式的靈活定義,可以使得協(xié)議解析的協(xié)議層次更清晰、語(yǔ)法更簡(jiǎn)潔。同時(shí)可以盡可能減少人工編碼,配合詞法分析器選擇更高效的匹配算法。為了構(gòu)造良好的協(xié)議解析文法產(chǎn)生式,擴(kuò)展產(chǎn)生式的構(gòu)造可以使用遞歸產(chǎn)生式、產(chǎn)生式分支優(yōu)化和產(chǎn)生式詞法展開(kāi)等方法。如果擴(kuò)展產(chǎn)生式中協(xié)議字段是由一個(gè)或多個(gè)相同的協(xié)議字段組成,可以定義遞歸產(chǎn)生式,例如:MIME_Header_Multi:MIME_Header_One|MIME_Header_MultiMIME_Header_One;遞歸產(chǎn)生式通常用來(lái)描述多個(gè)不確定出現(xiàn)順序的協(xié)議字段,其構(gòu)造方法是先定義一個(gè)擴(kuò)展產(chǎn)生式,產(chǎn)生式的左部是一個(gè)抽象的協(xié)議字段,產(chǎn)生式的右部是幾個(gè)不確定出現(xiàn)順序的協(xié)議字段的邏輯或,然后再定義這個(gè)抽象的協(xié)議字段的遞歸產(chǎn)生式,例如:MIME_Header_One:MIME_Header_Subject|MIME_Header_Content_Type;即協(xié)議字段MIME_Header_Subject和MIME_Header_Content_Type是MIME的首部協(xié)議字段,但無(wú)法確定二者出現(xiàn)在數(shù)據(jù)中的順序。遞歸產(chǎn)生式還需要一個(gè)跳出遞歸的方法,以避免文法分析的死循環(huán)。因此還需要一個(gè)往上層規(guī)約的擴(kuò)展產(chǎn)生式,例如:MIME_Headers:MIME_Header_MultiMIME_Header_End;使用遞歸產(chǎn)生式的優(yōu)點(diǎn)是表達(dá)簡(jiǎn)潔,例如使用非遞歸產(chǎn)生式的表達(dá)方法如下:MIME_Headers:MIME_Header_SubjectMIME_Header_Content_TypeMIME_Header_End;MIME_Headers:MIME_Header_Content_TypeMIME_Header_SubjectMIME_Header_End;通過(guò)上述對(duì)比可知,使用遞歸產(chǎn)生式可以減小文法的復(fù)雜度,并且可以將識(shí)別MIME_Header_Subject、MIME_Header_Content_Type和MIME_Header_End的有區(qū)分度的模式串歸集到同一個(gè)詞法分析器的模式串集合中,可以提高模式串匹配的效率。例如:MIME_Header_Subject:mime_atom_stream($1~/^Subject:.*\n(\t.*\n)*/i);MIME_Header_Content_Type:mime_atom_stream($1~/^Content-Type:.*\n(\t.*\n)*/i);MIME_Header_End:mime_atom_stream($1~/(^|\n).*\r\n/i);即該語(yǔ)法分析狀態(tài)下的詞法分析器的模式串集合包含以上三個(gè)正則模式串,可以減少文法產(chǎn)生式右部的復(fù)雜度。通過(guò)使用擴(kuò)展產(chǎn)生式描述協(xié)議解析規(guī)則中的分支判定,可以減少協(xié)議解析中動(dòng)作部分需要人工編碼的復(fù)雜度。例如,協(xié)議的Content-Transfer-Encoding首部字段定義了協(xié)議正文的傳輸編碼類型,現(xiàn)有技術(shù)的文法分析處理方法是定義該首部的基礎(chǔ)產(chǎn)生式并保存編碼類型的動(dòng)作,然后在郵件正文解析時(shí)判斷編碼類型并給予不同的解析動(dòng)作,例如:而在采用擴(kuò)展產(chǎn)生式優(yōu)化后:MIME_Header_Content_Transfer_Encode_base64:mime_atom_stream($1~/^Content-Transfer-Encoding:base64\r\n/i);MIME_Body_Base64:MIME_Body{mime_body_action_base64($1,...);};MIME_Header_Content_Transfer_Encode_quoted_printable:mime_atom_stream($1~/^Content-Transfer-Encoding:quoted_printable\r\n/i);MIME_Body_Quoted_Printable:MIME_Body{mime_body_action_quoted_printable($1,...);};優(yōu)化后的擴(kuò)展產(chǎn)生式的文法描述更加清晰,還可以跟其他復(fù)雜分支條件進(jìn)一步組合,例如郵件正文的編碼字符集也是由郵件首部給出的:MIME_Header_Charset_UTF8:mime_atom_stream($1~/charset=.*UTF-8.*\r\n/i);MIME_Header_Charset_GB2312:mime_atom_stream($1~/charset=.*GB2312.*\r\n/i);……MIME_Body_UTF8_Base64:MIME_Body{mime_body_acton_utf8_base64($1,…);};MIME_Body_GB2312_Base64:MIME_Body{mime_body_acton_gb2312_base64($1,…);};MIME_Body_UTF8_Quoted_Printable:MIME_Body{mime_body_acton_utf8_quoted_printable($1,…);};MIME_Body_GB2312_Quoted_Printable:MIME_Body{mime_body_acton_gb2312_quoted_printable($1,…);};協(xié)議解析規(guī)則文法的基礎(chǔ)產(chǎn)生式定義協(xié)議字段的文法描述,對(duì)于復(fù)雜的協(xié)議字段,產(chǎn)生式右部終結(jié)符的模式串也會(huì)很復(fù)雜。對(duì)于描述協(xié)議字段的復(fù)雜模式串,可以通過(guò)產(chǎn)生式詞法展開(kāi)的方法,將復(fù)雜模式串分割成多個(gè)簡(jiǎn)單模式串,根據(jù)每個(gè)簡(jiǎn)單模式串定義一個(gè)基礎(chǔ)產(chǎn)生式,其中產(chǎn)生式右部為帶謂詞的終結(jié)符號(hào)且產(chǎn)生式左部為非終結(jié)符號(hào),即分割后細(xì)化的協(xié)議字段域。然后根據(jù)協(xié)議字段域定義擴(kuò)展產(chǎn)生式,其中產(chǎn)生式右部為協(xié)議字段域的語(yǔ)法關(guān)系且產(chǎn)生式左部為產(chǎn)生的協(xié)議字段。例如郵件Subject協(xié)議字段,可能對(duì)應(yīng)一個(gè)多行多字符集多編碼類型的數(shù)據(jù)內(nèi)容:“Subject:=?utf-8?B?UE1D55Sf5Lqn6K6h5YiS5Y+K54mp5paZ5o6n5Yi2IOWKoeWuniAgICAg?==?GB2312?B?t6I=?=”為了解析得到原始的數(shù)據(jù)內(nèi)容,簡(jiǎn)單的基礎(chǔ)產(chǎn)生式定義為:MIME_Header_Subject:mime_atom_stream($1~/^Subject:.*((=\?[a-zA-Z0-9-]+\?=\r\n)([\t\s]+=\?[a-zA-Z0-9-]+\?=)*)*/i){mime_subject_decode_action($1,...)};該產(chǎn)生式右部終結(jié)符的模式串很復(fù)雜,文法的解析程度也不夠,導(dǎo)致產(chǎn)生式的動(dòng)作部分會(huì)很復(fù)雜。采用產(chǎn)生式詞法展開(kāi)的方法,可以對(duì)產(chǎn)生式的詞法進(jìn)行分割,描述成擴(kuò)展產(chǎn)生式如下:即通過(guò)產(chǎn)生式詞法展開(kāi)的方法構(gòu)造擴(kuò)展產(chǎn)生式后,主要的解析邏輯由一個(gè)產(chǎn)生式的動(dòng)作部分展開(kāi)到多個(gè)擴(kuò)展產(chǎn)生式的動(dòng)作部分,用于詞法分析的詞法分析器由一個(gè)展開(kāi)成多個(gè),可以有效降低詞法分析的復(fù)雜度,也可以使得語(yǔ)法分析的邏輯更清晰明了,具有協(xié)議字段分層描述能力。同時(shí)可以使得對(duì)應(yīng)的需要人工編碼的產(chǎn)生式動(dòng)作部分的邏輯更加簡(jiǎn)單,更加符合主要解析邏輯由文法產(chǎn)生式描述的解析規(guī)則文法的編寫原則。協(xié)議解析擴(kuò)展產(chǎn)生式的詞法展開(kāi),使得協(xié)議字段內(nèi)容的復(fù)雜關(guān)系既可以用謂詞模式串描述,也可以用分層的文法產(chǎn)生式描述,提供了一種均衡考慮詞法和語(yǔ)法分析效率的方法,使得協(xié)議解析規(guī)則開(kāi)發(fā)者可以根據(jù)協(xié)議的語(yǔ)法和詞法復(fù)雜度考慮不同的規(guī)則產(chǎn)生式寫法,綜合考慮文法和詞法的復(fù)雜度和性能。產(chǎn)生式詞法展開(kāi)后,用于詞法分析的詞法分析器由一個(gè)展開(kāi)成多個(gè),對(duì)于某些特殊的數(shù)據(jù)匹配,例如在一個(gè)協(xié)議字段上定義的一段數(shù)據(jù)在另一個(gè)協(xié)議字段的數(shù)據(jù)中被引用,因此需要定義一種數(shù)據(jù)的引用方法描述跨詞法分析器的詞法匹配,即通過(guò)采用引用棧的方式以實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)和動(dòng)態(tài)引用。例如郵件正文可以由多部分組成:Content-Type:multipart/related;boundary=\"=====003_Dragon236671608472_=====\"…...--=====003_Dragon236671608472_=====Content-Type:multipart/related;boundary=\"=====002_Dragon236671608472_=====\"…...--=====002_Dragon236671608472_=====…...--=====002_Dragon236671608472_=====----=====003_Dragon236671608472_=====…...--=====003_Dragon236671608472_=====--如上所示的郵件正文是由兩部分組成,兩部分由邊界字符串分割,且邊界字符串由“boundary=”定義,然后邊界“=====002_Dragon236671608472_=====\”包圍的正文嵌套在邊界“=====003_Dragon236671608472_=====”包圍的內(nèi)容之內(nèi)。對(duì)邊界字符串的引用符合先入后出的順序,所以可以采用引用棧擴(kuò)展表達(dá)式的方式實(shí)現(xiàn)。首先在郵件的頭部定義邊界字符串的名稱:MIME_Header_Boundary:mime_atom_stream($1~/boundary=[“]?([^\n]+)[“]\r\n~dynref_push(“boundary”,\1)/i);即“dynref_push”是動(dòng)態(tài)存儲(chǔ)表達(dá)式的關(guān)鍵詞,即詞法分析器匹配命中模式串第1個(gè)分組的數(shù)據(jù)被當(dāng)做邊界字符串存儲(chǔ)到引用棧的棧頂且命名為“boundary”。郵件正文中每個(gè)部分由邊界頭和邊界尾分割,分別由動(dòng)態(tài)引用表達(dá)式定義:MIME_Body_Boundary_Start:mime_atom_stream($1~/--([^\n]+)\r\n~dynref_top(“boundary”,\1)/i);MIME_Body_Boundary_End:mime_atom_stream($1~/--([^\n]+)--\r\n~dynref_top(“boundary”,\1)/i){dynref_pop(“boundary”);…};即“dynref_top”是動(dòng)態(tài)引用表達(dá)式的關(guān)鍵詞,即詞法分析器匹配命中模式串第1個(gè)分組的數(shù)據(jù)只能是存儲(chǔ)在引用棧棧頂且命名為“boundary”的數(shù)據(jù)。為了配合對(duì)引用棧中存儲(chǔ)數(shù)據(jù)的操作,在產(chǎn)生式的動(dòng)作部分定義可選的dynref_pop函數(shù)以實(shí)現(xiàn)引用棧的棧頂數(shù)據(jù)出棧的操作,即通過(guò)動(dòng)態(tài)存儲(chǔ)表達(dá)式和動(dòng)態(tài)引用表達(dá)式實(shí)現(xiàn)引用數(shù)據(jù)在多個(gè)產(chǎn)生式謂詞上的引用。上述部分詳細(xì)介紹的本公開(kāi)中的基礎(chǔ)產(chǎn)生式和擴(kuò)展產(chǎn)生式的編寫規(guī)則,以下介紹系統(tǒng)運(yùn)行階段的詳細(xì)內(nèi)容。在系統(tǒng)運(yùn)行階段,分為預(yù)處理步驟和解析步驟。在預(yù)處理步驟中,根據(jù)上述的協(xié)議解析規(guī)則文法編寫規(guī)則編寫協(xié)議解析規(guī)則文法,生成一個(gè)用于規(guī)則語(yǔ)法分析的語(yǔ)法分析器。其中,包含一個(gè)狀態(tài)自動(dòng)機(jī),然后根據(jù)語(yǔ)法分析器中自動(dòng)機(jī)的每個(gè)狀態(tài)下可輸入的文法符號(hào)謂詞的模式串歸集起來(lái),構(gòu)建該狀態(tài)下的詞法分析器,并由語(yǔ)法分析器根據(jù)不同的自動(dòng)機(jī)狀態(tài)動(dòng)態(tài)調(diào)用以分析該狀態(tài)下待解析的協(xié)議字段的若干模式串。語(yǔ)法分析器的自動(dòng)機(jī)使用LALR語(yǔ)法分析方法生成,其組成包括:控制器、狀態(tài)棧和符號(hào)棧、狀態(tài)跳轉(zhuǎn)表和動(dòng)作表、輸入和輸出。其中,控制器負(fù)責(zé)自動(dòng)機(jī)調(diào)度,狀態(tài)棧保存自動(dòng)機(jī)狀態(tài),符號(hào)棧保存輸入符號(hào),動(dòng)作表保存自動(dòng)機(jī)下一步的動(dòng)作,輸入的是協(xié)議終結(jié)符號(hào)和協(xié)議數(shù)據(jù),輸出的是已解析的協(xié)議字段。詞法分析器的建立方法是:檢查文法LALR生成算法所生成的代表每個(gè)自動(dòng)機(jī)狀態(tài)的項(xiàng)目集,歸集項(xiàng)目集中所有的終結(jié)符號(hào)謂詞的模式串生成一個(gè)模式串集合。由于詞法分析器是根據(jù)不同自動(dòng)機(jī)狀態(tài)下的項(xiàng)目集建立的,模式串集合可能包含一個(gè)或多個(gè)模式串,所以可以根據(jù)模式串的數(shù)量和特點(diǎn)使用不同的模式匹配算法,如果模式串集合為空,說(shuō)明該項(xiàng)目集中下一個(gè)可輸入符號(hào)是非終結(jié)符號(hào),詞法分析器默認(rèn)返回非終結(jié)符號(hào)自身即可;否則,建立模式串的多模匹配算法,且對(duì)特征引用規(guī)則的分詞特征建立動(dòng)態(tài)存儲(chǔ)標(biāo)識(shí),對(duì)引用匹配規(guī)則的分詞特征建立動(dòng)態(tài)引用標(biāo)識(shí),每組引用關(guān)系使用給定棧名的引用棧,由規(guī)則編寫者根據(jù)協(xié)議特性指定棧名,通過(guò)棧名查找相應(yīng)的引用棧。由于協(xié)議的每個(gè)字段是沒(méi)有歧義的,所以協(xié)議解析過(guò)程中得到的每個(gè)協(xié)議字段也應(yīng)該是無(wú)歧義的,產(chǎn)生協(xié)議字段的詞法分析器每次匹配只能返回一個(gè)確定的命中模式串。因此詞法分析器中模式串的多模匹配算法需要具有“非貪婪”的特性,即當(dāng)匹配到一個(gè)模式串時(shí)立即終止匹配,返回的是數(shù)據(jù)匹配范圍最短的協(xié)議字段,避免解析的歧義。語(yǔ)法分析器每動(dòng)態(tài)調(diào)用一次語(yǔ)法狀態(tài)下的詞法分析器,都要根據(jù)詞法分析器所返回模式串的數(shù)據(jù)匹配范圍調(diào)整剩余待匹配的協(xié)議數(shù)據(jù)。以下詳細(xì)介紹協(xié)議解析部分。圖1所示,為根據(jù)本公開(kāi)的一種實(shí)施方式提供的協(xié)議數(shù)據(jù)解析方法的流程圖。如圖1所示,該方法包括以下步驟:在步驟S11中,接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂,其中,該協(xié)議終結(jié)符號(hào)為在系統(tǒng)開(kāi)發(fā)階段中的定義的協(xié)議終結(jié)符號(hào)。在步驟S12中,將待匹配的協(xié)議數(shù)據(jù)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器。在步驟S13中,將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器。其中,該詞法分析器是通過(guò)上述系統(tǒng)運(yùn)行階段中的預(yù)處理部分中根據(jù)語(yǔ)法分析中的狀態(tài)對(duì)應(yīng)生成的,該詞法分析器中為歸集了當(dāng)前棧頂狀態(tài)下的所有模式串的模式串集合。該詞法分析器的詞法分析過(guò)程為:如果當(dāng)前棧頂符號(hào)為非終結(jié)符號(hào)或是帶謂詞的終結(jié)符號(hào),則詞法分析器返回該符號(hào)本身,詞法分析完成;如果當(dāng)前棧頂符號(hào)為終結(jié)符號(hào),則將待匹配的協(xié)議數(shù)據(jù)與該詞法分析器中的模式串集合用多模匹配算法進(jìn)行匹配,在發(fā)現(xiàn)第一個(gè)模式串命中時(shí)判斷模式串標(biāo)識(shí):若標(biāo)識(shí)為動(dòng)態(tài)存儲(chǔ)標(biāo)識(shí),則將命中的數(shù)據(jù)內(nèi)容存儲(chǔ)到引用棧,返回帶謂詞的終結(jié)符號(hào)和數(shù)據(jù)匹配范圍并終止匹配;若標(biāo)識(shí)為動(dòng)態(tài)引用標(biāo)識(shí),則將命中的數(shù)據(jù)內(nèi)容與引用棧的棧頂數(shù)據(jù)比較,若相等則返回帶謂詞的終結(jié)符號(hào)和數(shù)據(jù)匹配范圍,否則忽略當(dāng)前命中的模式串繼續(xù)匹配;若無(wú)標(biāo)識(shí),則終止匹配并返回帶謂詞的終結(jié)符號(hào)和數(shù)據(jù)匹配范圍,詞法分析完成。在步驟S14中,接收所述詞法分析器的返回結(jié)果,該返回結(jié)果可以是帶謂詞的終結(jié)符號(hào)或是非終結(jié)符號(hào)。在步驟S15中,在所述返回結(jié)果為帶謂詞的終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述帶謂詞的終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件,其中,所述帶謂詞的終結(jié)符號(hào)包括所述協(xié)議的終結(jié)符號(hào)和所述詞法分析器匹配到的模式串。在語(yǔ)法分析器的輸入符號(hào)為帶謂詞的終結(jié)符號(hào)時(shí),通過(guò)查詢動(dòng)作表,可以確定產(chǎn)生規(guī)約事件或是移進(jìn)事件,該動(dòng)作表是通過(guò)在預(yù)處理階段生成語(yǔ)法分析器時(shí),根據(jù)系統(tǒng)開(kāi)發(fā)階段編寫的協(xié)議解析規(guī)則文法生成的。在步驟S16中,在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作,并返回步驟S13。其中,移進(jìn)操作包括:將根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述詞法分析器的返回結(jié)果確定的下一狀態(tài)壓入狀態(tài)棧的棧頂,將所述詞法分析器的返回結(jié)果壓入所述符號(hào)棧的棧頂。通過(guò)上述技術(shù)方案,由于本公開(kāi)中不同的狀態(tài)對(duì)應(yīng)不同的詞法分析器,在不同狀態(tài)下,當(dāng)匹配到相同的模式串時(shí),也可以向語(yǔ)法分析器輸入不同的非終結(jié)符號(hào),相對(duì)獨(dú)立的詞法分析器的變化影響范圍較小,使得詞法分析器的修改和擴(kuò)充更加方便。同時(shí),減少詞法分析器中的模式串的數(shù)量,可以降低詞法分析的復(fù)雜度,使得詞法分析器可以根據(jù)模式串的特點(diǎn)選擇最適宜的模式串匹配算法,從而提高詞法分析的性能。詞法分析器在進(jìn)行模式串匹配時(shí),只需要匹配當(dāng)前狀態(tài)下對(duì)應(yīng)的詞法分析器中歸集的模式串,可以避免產(chǎn)生語(yǔ)法沖突,從而提高協(xié)議數(shù)據(jù)解析的效率和準(zhǔn)確性??蛇x地,該方法還可以包括:在步驟S17中,在確定產(chǎn)生規(guī)約事件時(shí),執(zhí)行規(guī)約操作,并返回步驟S13。其中,規(guī)約操作包括:輸出規(guī)約后產(chǎn)生的非終結(jié)符所表示的協(xié)議字段,利用所述非終結(jié)符替換當(dāng)前所述符號(hào)棧中與所述規(guī)約事件有關(guān)的符號(hào),并將當(dāng)前所述狀態(tài)棧中、與所述規(guī)約事件有關(guān)的符號(hào)所對(duì)應(yīng)的狀態(tài)彈出。在執(zhí)行完移進(jìn)操作或是規(guī)約操作后,需要將待匹配的協(xié)議數(shù)據(jù)的起始位置移動(dòng)到當(dāng)前已匹配的數(shù)據(jù)之后的位置之后執(zhí)行跳轉(zhuǎn)動(dòng)作,直至生成協(xié)議的目標(biāo)符號(hào)或者待匹配數(shù)據(jù)為空。圖2所示,為根據(jù)本公開(kāi)的另一種實(shí)施方式提供的協(xié)議數(shù)據(jù)解析方法的流程圖。如圖2所示,在圖1的基礎(chǔ)上,所述方法還可以包括:在步驟S21中,判斷返回結(jié)果是帶謂詞的終結(jié)符號(hào)或是非終結(jié)符號(hào),在返回結(jié)果是帶謂詞的終結(jié)符號(hào)時(shí),轉(zhuǎn)入步驟S15,否則,在返回結(jié)果是非終結(jié)符號(hào)時(shí),轉(zhuǎn)入步驟S22。在步驟S22中,根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件或是接受事件。在步驟S23中,在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作。其中,該移進(jìn)操作與前文所述的移進(jìn)操作相同,在此不再贅述。在語(yǔ)法分析器的輸入符號(hào)為非終結(jié)符號(hào)時(shí),通過(guò)查詢跳轉(zhuǎn)表以確定下一狀態(tài),該跳轉(zhuǎn)表是通過(guò)在預(yù)處理階段生成語(yǔ)法分析器時(shí),根據(jù)系統(tǒng)開(kāi)發(fā)階段編寫的協(xié)議解析規(guī)則文法生成的。在步驟S24中,根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件,在判定能繼續(xù)產(chǎn)生規(guī)約事件時(shí),轉(zhuǎn)入步驟S13,否則,在判定不能繼續(xù)產(chǎn)生規(guī)約事件時(shí),轉(zhuǎn)入接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂?shù)牟襟ES11,其中,再次接收的待匹配的協(xié)議數(shù)據(jù)是前次接收的待匹配的協(xié)議數(shù)據(jù)中除去前次已匹配完成的數(shù)據(jù)部分后剩余的數(shù)據(jù)部分。在該實(shí)施例中,在詞法分析器的返回結(jié)果為非終結(jié)符號(hào)時(shí),在執(zhí)行完相應(yīng)的操作后,要根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和符號(hào)棧判斷下一步要執(zhí)行的操作,從而判斷下一步要跳轉(zhuǎn)的步驟。通過(guò)上述技術(shù)方案,在輸入符號(hào)為非終結(jié)符號(hào)時(shí),對(duì)下一步要執(zhí)行的操作進(jìn)行預(yù)判,可以準(zhǔn)確地判定下一步跳轉(zhuǎn)的步驟,可以提高協(xié)議解析的效率和準(zhǔn)確性??蛇x地,該方法還可以包括:在步驟S25中,在確定產(chǎn)生規(guī)約事件時(shí),進(jìn)行規(guī)約操作,并返回所述根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件的步驟S24。其中,該規(guī)約操作的步驟與上述規(guī)約操作相同,在此不再贅述。另外,在執(zhí)行完移進(jìn)操作或是規(guī)約操作后,需要將待匹配的協(xié)議數(shù)據(jù)的起始位置移動(dòng)到當(dāng)前已匹配的數(shù)據(jù)之后的位置之后執(zhí)行跳轉(zhuǎn)動(dòng)作,直至生成協(xié)議的目標(biāo)符號(hào)或者待匹配數(shù)據(jù)為空。在步驟S26中,在確定產(chǎn)生接受事件時(shí),獲得協(xié)議的目標(biāo)非終結(jié)符號(hào)??蛇x地,所述詞法分析器匹配到的模式串是所述詞法分析器自身自帶的模式串集合中的一者,或者是所述詞法分析器根據(jù)引用標(biāo)識(shí)從引用棧獲取到的模式串,其中,所述引用棧中存儲(chǔ)有至少一個(gè)模式串,所述引用棧能夠被其他詞法分析器訪問(wèn)。在該實(shí)施例中,該詞法分析器中匹配到的模式串可以是根據(jù)自動(dòng)機(jī)的狀態(tài)歸集的該狀態(tài)下的所有模式串的集合,也可以包括從引用棧獲取的模式串。其中,如上所述,在系統(tǒng)開(kāi)發(fā)階段的協(xié)議解析規(guī)則文法中,對(duì)產(chǎn)生式詞法展開(kāi)方式構(gòu)造的產(chǎn)生式要編寫特征引用規(guī)則和引用匹配規(guī)則,為每一組引用關(guān)系命名,其中特征引用規(guī)則用來(lái)動(dòng)態(tài)提取新的分詞特征,引用匹配規(guī)則使用新的分詞特征進(jìn)行分詞匹配。在系統(tǒng)運(yùn)行階段的預(yù)處理步驟中,詞法分析器對(duì)特征引用規(guī)則的分詞特征建立動(dòng)態(tài)存儲(chǔ)標(biāo)識(shí),對(duì)引用匹配規(guī)則的分詞特征建立動(dòng)態(tài)引用標(biāo)識(shí),并為每一組引用關(guān)系創(chuàng)建引用棧,通過(guò)引用關(guān)系名查找相應(yīng)的引用棧。在協(xié)議解析步驟中,詞法分析器中帶有動(dòng)態(tài)存儲(chǔ)標(biāo)識(shí)的分詞特征匹配到某一段數(shù)據(jù),則將匹配的數(shù)據(jù)存儲(chǔ)到相應(yīng)的引用棧中。詞法分析器中對(duì)于帶有動(dòng)態(tài)引用標(biāo)識(shí)的分詞特征,取得引用棧棧頂?shù)臄?shù)據(jù)替換該分詞特征,參與后續(xù)的分詞匹配過(guò)程。在上述技術(shù)方案中,通過(guò)采用引用棧存儲(chǔ)模式串的方式,可以通過(guò)動(dòng)態(tài)存儲(chǔ)標(biāo)識(shí)和動(dòng)態(tài)引用標(biāo)識(shí)實(shí)現(xiàn)數(shù)據(jù)引用在多個(gè)產(chǎn)生式謂詞上的引用,實(shí)現(xiàn)跨詞法分析器的模式串匹配,從而可以對(duì)文法產(chǎn)生式進(jìn)行擴(kuò)展,簡(jiǎn)化復(fù)雜模式串的匹配方式,節(jié)省資源。本公開(kāi)提供一種協(xié)議數(shù)據(jù)解析裝置。圖3所示,為根據(jù)本公開(kāi)的實(shí)施方式提供的一種協(xié)議數(shù)據(jù)解析裝置的框圖。如圖3所示,該裝置10包括:第一接收模塊110,用于接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂;第一輸入模塊120,用于將所述待匹配的協(xié)議數(shù)據(jù)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器;第二輸入模塊130,用于將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器;第二接收模塊140,用于接收所述詞法分析器的返回結(jié)果;第一確定模塊150,用于在所述返回結(jié)果為帶謂詞的終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述帶謂詞的終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件,其中,所述帶謂詞的終結(jié)符號(hào)包括所述協(xié)議的終結(jié)符號(hào)和所述詞法分析器匹配到的模式串;第一處理模塊160,用于在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作,并重新觸發(fā)所述第二輸入模塊130將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器。可選地,該述裝置還可以包括:第二處理模塊,用于在確定產(chǎn)生規(guī)約事件時(shí),執(zhí)行規(guī)約操作,并重新觸發(fā)所述第二輸入模塊130將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器??蛇x地,該裝置還可以包括:第二確定模塊,用于在所述返回結(jié)果為非終結(jié)符號(hào)時(shí),根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),確定產(chǎn)生規(guī)約事件或是移進(jìn)事件或是接受事件;第三處理模塊,用于在確定產(chǎn)生移進(jìn)事件時(shí),執(zhí)行移進(jìn)操作;判斷模塊,用于根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件,在判定能繼續(xù)產(chǎn)生規(guī)約事件時(shí),重新觸發(fā)所述第二輸入模塊130將從符號(hào)棧取出的當(dāng)前棧頂符號(hào)輸入至與狀態(tài)棧的當(dāng)前棧頂狀態(tài)相對(duì)應(yīng)的詞法分析器,在判定不能繼續(xù)產(chǎn)生規(guī)約事件時(shí),重新觸發(fā)所述第一接收模塊110接收待匹配的協(xié)議數(shù)據(jù),將協(xié)議的終結(jié)符號(hào)壓入符號(hào)棧的棧頂,其中,再次接收的待匹配的協(xié)議數(shù)據(jù)是前次接收的待匹配的協(xié)議數(shù)據(jù)中除去前次已匹配完成的數(shù)據(jù)部分后剩余的數(shù)據(jù)部分。可選地,該裝置還可以包括:第四處理模塊,用于在確定產(chǎn)生規(guī)約事件時(shí),進(jìn)行規(guī)約操作,并重新觸發(fā)所述判斷模塊根據(jù)狀態(tài)棧的當(dāng)前棧頂狀態(tài)和所述非終結(jié)符號(hào),判斷能否繼續(xù)產(chǎn)生規(guī)約事件;第五處理模塊,用于在確定產(chǎn)生接受事件時(shí),獲得協(xié)議的目標(biāo)非終結(jié)符號(hào)??蛇x地,所述詞法分析器匹配到的模式串是所述詞法分析器自身自帶的模式串集合中的一者,或者是所述詞法分析器根據(jù)引用標(biāo)識(shí)從引用棧獲取到的模式串,其中,所述引用棧中存儲(chǔ)有至少一個(gè)模式串,所述引用棧能夠被其他詞法分析器訪問(wèn)。本公開(kāi)還提供一種協(xié)議數(shù)據(jù)解析系統(tǒng)。圖4所示,為根據(jù)本公開(kāi)的一種實(shí)施方式提供的協(xié)議數(shù)據(jù)解析系統(tǒng)的框圖。如圖4所示,該系統(tǒng)包括:多個(gè)詞法分析器20,所述多個(gè)詞法分析器與語(yǔ)法分析器的多個(gè)狀態(tài)一一對(duì)應(yīng);所述語(yǔ)法分析器30,包括控制器40、狀態(tài)棧50和符號(hào)棧60,其中,所述控制器40包括上述的協(xié)議數(shù)據(jù)解析裝置10。可選地,該系統(tǒng)還可以包括:引用棧,用于存儲(chǔ)至少一個(gè)模式串,所述引用棧能夠被所述多個(gè)詞法分析器20中的至少兩個(gè)詞法分析器20訪問(wèn),以使所述至少兩個(gè)詞法分析器20能夠根據(jù)引用標(biāo)識(shí)從所述引用棧獲取相應(yīng)的模式串。以下以MIME的協(xié)議解析為例,分析具體的協(xié)議數(shù)據(jù)解析過(guò)程。根據(jù)語(yǔ)法分析器的狀態(tài)遷移所生成的詞法分析器如下所示,詞法分析器采用“pred_StateId_SymId”的命名方法,包含了一個(gè)模式串集合和對(duì)應(yīng)的多模匹配算法,默認(rèn)的詞法分析器不顯示,假定SymId為2,則每個(gè)詞法分析器的模式串集合如下:由上可知,在不同的狀態(tài)下,即使詞法分析器匹配到相同的模式串,也可以向語(yǔ)法分析器輸入不同的協(xié)議字段,可以降低語(yǔ)法產(chǎn)生是的復(fù)雜度,并且由于多個(gè)詞法分析器之間相對(duì)獨(dú)立,每個(gè)詞法分析器的變化所影響的范圍較小,能夠方便修改和擴(kuò)展。同時(shí),產(chǎn)生式詞法展開(kāi)之后,詞法分析器的模式串與展開(kāi)前的模式串“^Subject:.*((=?[a-zA-Z0-9-]+\?=\r\n)([\t\s]+=\?[a-zA-Z0-9-]+\?=)*)*”相比由復(fù)雜變?yōu)楹?jiǎn)單,而且有些詞法分析器中的模式串集合可以合并,有效提高了協(xié)議解析的詞法分析器匹配效率。如圖5所示,為根據(jù)本公開(kāi)的一種實(shí)施方式提供的語(yǔ)法分析器的狀態(tài)遷移圖。結(jié)合圖4和圖5,以MIME協(xié)議主題字段的檢測(cè)過(guò)程為例,詳細(xì)闡述協(xié)議數(shù)據(jù)解析的過(guò)程。初始的協(xié)議數(shù)據(jù)為數(shù)據(jù)包中所有數(shù)據(jù),為"Subject:=?utf-8?B?xxx?=\r\n\t=?GB2312?B?yyy=?=\r\n",初始棧頂狀態(tài)為S0,協(xié)議數(shù)據(jù)解析的過(guò)程如下:控制器接收協(xié)議數(shù)據(jù)輸入,并將協(xié)議終結(jié)符號(hào)mime_atom_stream作為輸入符號(hào)壓入符號(hào)棧的棧頂,終結(jié)符號(hào)的待匹配數(shù)據(jù)為"Subject:=?utf-8?B?xxx?==?GB2312?B?yyy=?=\r\n"。詞法分析器匹配。控制器從狀態(tài)棧中取出棧頂狀態(tài)S0,從符號(hào)棧的棧頂中取出棧頂符號(hào)mime_atom_stream作為詞法分析器的輸入符號(hào),得到狀態(tài)S0下輸入符號(hào)的詞法分析器pred_0_2,將待匹配的協(xié)議數(shù)據(jù)與詞法分析器中的分詞特征,即詞法分析器中歸集的模式串,用多模匹配算法進(jìn)行匹配,命中模式串“^Subject:”,終止數(shù)據(jù)匹配,返回帶謂詞的終結(jié)符號(hào)“mime_atom_stream($1~/^Subject:/i)”和數(shù)據(jù)的匹配范圍[0,7]。語(yǔ)法分析器分析。詞法分析器返回的是帶謂詞的終結(jié)符號(hào)“mime_atom_stream($1~/^Subject:/i)”,查詢動(dòng)作表,確定產(chǎn)生移進(jìn)事件,則將下一跳狀態(tài)S2壓入狀態(tài)棧(狀態(tài)棧為[S0,S2]),將帶謂詞的終結(jié)符號(hào)“mime_atom_stream($1~/^Subject:/i)”壓入符號(hào)棧,同時(shí)待匹配的協(xié)議數(shù)據(jù)變更為“=?utf-8?B?xxx?=\r\n\t=?GB2312?B?yyy=?=\r\n”,再次轉(zhuǎn)入調(diào)用詞法分析器的步驟。之后依次解析采用表示方法“([狀態(tài)棧],[符號(hào)棧])--查表動(dòng)作(移進(jìn)或規(guī)約的符號(hào))→([新的狀態(tài)棧],[新的符號(hào)棧])”對(duì)移進(jìn)事件或規(guī)約事件進(jìn)行描述,如下所示:([S0,S2],[mime_atom_stream($1~/^Subject:/i)])--規(guī)約(mime_atom_stream($1~/^Subject:/i))→([S0],[MIME_Subject_label])--移進(jìn)(MIME_Subject_label)→([S0,S1],[MIME_Subject_label])詞法分析器匹配命中數(shù)據(jù)“=?utf-8”并得到模式串“=\?UTF-8”之后,--移進(jìn)(mime_atom_stream($1~/=\?UTF-8/i))→([S0,S1,S6],[MIME_Subject_label,mime_atom_stream($1~/=\?UTF-8/i)])--規(guī)約(mime_atom_stream($1~/=\?UTF-8/i))→([S0,S1],[MIME_Subject_label,MIME_Subject_Charset_UTF8])--移進(jìn)(MIME_Subject_Charset_UTF8)→([S0,S1,S20],[MIME_Subject_label,MIME_Subject_Charset_UTF8])詞法分析器匹配命中數(shù)據(jù)“?B?xxx?=“并得到模式串“\?B\?.*\?=”之后,--移進(jìn)(mime_atom_stream($1~/\?B\?.*\?=/i))→([S0,S1,S20,S11],[MIME_Subject_label,MIME_Subject_Charset_UTF8,mime_atom_stream($1~/\?B\?.*\?=/i)])--規(guī)約(mime_atom_stream($1~/\?B\?.*\?=/i))→([S0,S1,S20],[MIME_Subject_label,MIME_Subject_Charset_UTF8,MIME_Subject_Encode_Base64])--移進(jìn)(MIME_Subject_Encode_Base64)→([S0,S1,S20,S22],[MIME_Subject_label,MIME_Subject_Charset_UTF8,MIME_Subject_Encode_Base64])--規(guī)約(MIME_Subject_Charset_UTF8,MIME_Subject_Encode_Base64)→([S0,S1],[MIME_Subject_label,MIME_Subject_Encode_One])--移進(jìn)(MIME_Subject_Encode_One)→([S0,S1,S19],[MIME_Subject_label,MIME_Subject_Encode_One])--規(guī)約(MIME_Subject_Encode_One)→([S0,S1],[MIME_Subject_label,MIME_Subject_Encode_Multi])--移進(jìn)(MIME_Subject_Encode_Multi)→([S0,S1,S14],[MIME_Subject_label,MIME_Subject_Encode_Multi])在以上協(xié)議數(shù)據(jù)解析的過(guò)程中,每執(zhí)行一次移動(dòng)操作要跳轉(zhuǎn)到調(diào)用詞法分析器的步驟;每執(zhí)行一次規(guī)約操作,則要對(duì)下一步的操作進(jìn)行預(yù)判以確定要跳轉(zhuǎn)到協(xié)議數(shù)據(jù)輸入步驟還是調(diào)用詞法分析器的步驟。在上述協(xié)議數(shù)據(jù)解析過(guò)程中,依次解析出協(xié)議字段“MIME_Subject_label,MIME_Subject_Charset_UTF8,MIME_Subject_Encode_Base64”,以及分層抽象的協(xié)議字段“MIME_Subject_Encode_One,MIME_Subject_Encode_Multi”,解析完成的協(xié)議數(shù)據(jù)內(nèi)容是“Subject:=?utf-8?B?xxx?=”,待匹配的協(xié)議數(shù)據(jù)內(nèi)容是“\r\n\t=?GB2312?B?yyy=?=\r\n”,后續(xù)的檢測(cè)過(guò)程與之前類似,不再詳細(xì)推導(dǎo)。以上結(jié)合附圖詳細(xì)描述了本公開(kāi)的優(yōu)選實(shí)施方式,但是,本公開(kāi)并不限于上述實(shí)施方式中的具體細(xì)節(jié),在本公開(kāi)的技術(shù)構(gòu)思范圍內(nèi),可以對(duì)本公開(kāi)的技術(shù)方案進(jìn)行多種簡(jiǎn)單變型,這些簡(jiǎn)單變型均屬于本公開(kāi)的保護(hù)范圍。另外需要說(shuō)明的是,在上述具體實(shí)施方式中所描述的各個(gè)具體技術(shù)特征,在不矛盾的情況下,可以通過(guò)任何合適的方式進(jìn)行組合,為了避免不必要的重復(fù),本公開(kāi)對(duì)各種可能的組合方式不再另行說(shuō)明。此外,本公開(kāi)的各種不同的實(shí)施方式之間也可以進(jìn)行任意組合,只要其不違背本公開(kāi)的思想,其同樣應(yīng)當(dāng)視為本公開(kāi)所公開(kāi)的內(nèi)容。當(dāng)前第1頁(yè)1 2 3 當(dāng)前第1頁(yè)1 2 3