專利名稱:文本編碼類協(xié)議通用解析器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)通信技術(shù)領(lǐng)域,尤其涉及一種文本編碼類協(xié)議通用解析器。
背景技術(shù):
Internet工程任務(wù)組(IETF,Internet Engineering Task Force)組織使用ABNF定義了多個(gè)協(xié)議中的報(bào)文格式,例如會(huì)話起始協(xié)議(SIP,SessionInitiation Protocol)等。在實(shí)現(xiàn)這些協(xié)議時(shí),需要按照擴(kuò)展巴克斯范式(ABNF,Augmented BNF)規(guī)則對(duì)報(bào)文進(jìn)行分析和模式。
ABNF是IETF組織在RFC2234中定義的一個(gè)字符串模式匹配的文法定義。ABNF是在巴克斯范式(BNF)基礎(chǔ)上的擴(kuò)展,其與標(biāo)準(zhǔn)巴克斯范式的區(qū)別包括命名規(guī)則,循環(huán),選擇,次序獨(dú)立以及值域。
目前,常見的ABNF解析器的實(shí)現(xiàn)方案為在通用微處理器上,使用軟件來實(shí)現(xiàn)編譯原理領(lǐng)域內(nèi)的詞法和語法解析算法。例如,常見的LL(1)文法解析算法,該算法是一種自上而下的非遞歸預(yù)測(cè)分析器,它通過計(jì)算文法的首終結(jié)符集合(First集合)和后繼終結(jié)符集合(Follow集合)從而構(gòu)造出該文法的預(yù)測(cè)分析表,進(jìn)而利用分析表進(jìn)行推導(dǎo)。LL(1)文法是無二義的文法,且不含左遞歸。LL(1)中的第一個(gè)“L”表示從左到右地掃描輸入串;第二個(gè)“L”表示產(chǎn)生最左推導(dǎo);1代表在決定分析器的每步動(dòng)作時(shí)向前看一個(gè)輸入符號(hào)。
由于ABNF是基于文本定義的語法,所以在對(duì)變長(zhǎng)的字符串解析時(shí),其復(fù)雜度高于基于二進(jìn)制的定長(zhǎng)數(shù)據(jù)解析。上述方案的優(yōu)點(diǎn)在于解析器開發(fā)代價(jià)小,開發(fā)效率高。但是,由于通用處理器并不是專門針對(duì)ABNF解析進(jìn)行設(shè)計(jì)的,因而其處理速度、吞吐量等性能參數(shù)往往受限。當(dāng)需要高速處理能力時(shí),例如,SIP軟交換系統(tǒng)需要處理百萬量級(jí)的連接,則為了達(dá)到性能要求需要采用更高級(jí)別的微處理器,這樣,必然提高解析器產(chǎn)品的成本。
目前,采用的另一種ABNF解析方案是也是在通用微處理器上,針對(duì)特定領(lǐng)域內(nèi)ABNF語法規(guī)則的特點(diǎn)設(shè)計(jì)特定的軟件來進(jìn)行處理。以SIP協(xié)議棧為例,常見的實(shí)現(xiàn)方式是根據(jù)SIP文法規(guī)則的特點(diǎn),通過分割符將SIP報(bào)文分割為若干字段,再進(jìn)行相應(yīng)的語法規(guī)則檢查。
在這一方案中針對(duì)特定語法規(guī)則進(jìn)行設(shè)計(jì),在效率上優(yōu)于前面描述的技術(shù)方案。但是由于其針對(duì)特定規(guī)則進(jìn)行處理,導(dǎo)致其通用性較差,針對(duì)新的語法規(guī)則必須重新進(jìn)行設(shè)計(jì),從而提高了解析器開發(fā)成本,導(dǎo)致開發(fā)效率較低。另一方面,由于其仍然是基于通用微處理器進(jìn)行的,在需要高速處理能力的情況下仍然會(huì)存在前面描述的第一種方案所存在的問題。
發(fā)明內(nèi)容
鑒于上述現(xiàn)有技術(shù)所存在的問題,本發(fā)明的目的是提供一種文本編碼類協(xié)議通用解析器,提高解析器的解析效率,并使解析器具有良好的通用性。
本發(fā)明的目的是通過以下技術(shù)方案實(shí)現(xiàn)的本發(fā)明提供了一種文本編碼類協(xié)議通用解析器,該解析器包括規(guī)則存儲(chǔ)模塊、待解析消息存儲(chǔ)模塊和消息解析模塊,消息解析模塊根據(jù)規(guī)則存儲(chǔ)模塊中保存的規(guī)則信息對(duì)待解析消息存儲(chǔ)模塊中的消息文本進(jìn)行解析處理,所述的消息解析模塊為采用邏輯芯片實(shí)現(xiàn)。
所述的邏輯芯片包括現(xiàn)場(chǎng)可編程邏輯門列陣FPGA或復(fù)雜可編程邏輯器件CPLD。
所述的規(guī)則存儲(chǔ)模塊為規(guī)則樹存儲(chǔ)模塊,規(guī)則樹存儲(chǔ)模塊中保存有基于擴(kuò)展巴克斯范式ABNF方法定義的規(guī)則生成的規(guī)則樹。
所述的規(guī)則樹為不包含增式選擇、序列組及可選序列結(jié)構(gòu)的規(guī)則樹,且所述的規(guī)則樹為以各規(guī)則中的一個(gè)規(guī)則為頂點(diǎn),采用遞歸的方式生成的規(guī)則樹。
所述的消息解析模塊進(jìn)一步包括主進(jìn)程處理部分用于根據(jù)棧頂節(jié)點(diǎn)的類型控制分別進(jìn)入解析終結(jié)符部分、匹配首終結(jié)符部分或匹配后繼終結(jié)符部分的處理過程;解析終結(jié)符部分用于當(dāng)棧頂結(jié)點(diǎn)為終結(jié)節(jié)點(diǎn)時(shí),由主進(jìn)程處理部分控制啟動(dòng),并進(jìn)行終結(jié)節(jié)點(diǎn)的終結(jié)符的解析處理,解析完成后通知主進(jìn)程處理部分;匹配首終結(jié)符部分用于對(duì)當(dāng)棧頂結(jié)點(diǎn)為非終結(jié)點(diǎn)時(shí),且為首終結(jié)符集合時(shí),由主進(jìn)程處理部分控制啟動(dòng),并進(jìn)行首終結(jié)符的匹配處理,判斷當(dāng)前字符是否在節(jié)點(diǎn)首終結(jié)符集合內(nèi),匹配完成后通知主進(jìn)程處理部分;匹配后繼終結(jié)符部分用于對(duì)當(dāng)棧頂結(jié)點(diǎn)為非終結(jié)點(diǎn)時(shí),且為后繼終結(jié)符集合時(shí),由主進(jìn)程處理部分控制啟動(dòng),并進(jìn)行后繼終結(jié)符的匹配處理,判斷當(dāng)前字符是否在節(jié)點(diǎn)后繼終結(jié)符集合內(nèi),匹配完成后通知主進(jìn)程處理部分。
所述的消息解析模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。
所述的主進(jìn)程處理部分對(duì)應(yīng)的狀態(tài)機(jī)包括循環(huán)解析PARSE_LOOP狀態(tài),在該狀態(tài)下進(jìn)行消息報(bào)文的解析;到達(dá)最大重復(fù)次數(shù)REPEAT_MAX狀態(tài),在該狀態(tài)下判斷保存首規(guī)則樹節(jié)點(diǎn)的節(jié)點(diǎn)棧的棧頂節(jié)點(diǎn)的類型是否為終結(jié)節(jié)點(diǎn);匹配終結(jié)符TERM_MATCH狀態(tài),在該狀態(tài)下進(jìn)行終結(jié)符的匹配處理張,并啟動(dòng)解析終結(jié)符部分;
進(jìn)入首終結(jié)符集合判斷IN_FIRST狀態(tài),在該狀態(tài)下進(jìn)行首終結(jié)符集合的判斷處理,并在確定存在首終結(jié)符集合時(shí),啟動(dòng)匹配首終結(jié)符部分;所有的子節(jié)點(diǎn)已經(jīng)處理ALLSUB狀態(tài),當(dāng)IN_FIRST狀態(tài)下所有的子節(jié)點(diǎn)處理完成時(shí)進(jìn)入該狀態(tài),且在該狀態(tài)下返回PARSE_LOOP狀態(tài);后繼終結(jié)符集判斷JUDGE_FOLLOW狀態(tài),在該狀態(tài)下進(jìn)行后繼終結(jié)符集合的判斷處理,并在確定存在后繼終結(jié)符集合時(shí),進(jìn)入FOLLOW集合判斷IN_FOLLOW狀態(tài),啟動(dòng)匹配后繼終結(jié)符部分,如果不存在后繼終結(jié)符集合時(shí)進(jìn)入下一規(guī)則NEXTRULE狀態(tài),并返回PARSE_LOOP狀態(tài)的。
所述的解析終結(jié)符部分的狀態(tài)機(jī)包括字符串類型終結(jié)符TERM_STRING狀態(tài),在該狀態(tài)下對(duì)單個(gè)字符串循環(huán)進(jìn)行單個(gè)字符的匹配處理;字符編碼連接類型終結(jié)符TERM_CODE_LIST狀態(tài),在該狀態(tài)下對(duì)字符編碼連接循環(huán)進(jìn)行單個(gè)字符的匹配處理;終結(jié)符匹配成功TERM_SUCCESS狀態(tài)和終結(jié)符匹配失敗TERM_FAIL狀態(tài),在該狀態(tài)下通知主進(jìn)程處理部分匹配處理結(jié)果。
所述的匹配首終結(jié)符部分的狀態(tài)機(jī)包括列表循環(huán)處理UST_LOOP狀態(tài),在該狀態(tài)下判斷編碼類型為字符串字符編碼連接;字符串類型FIRST_STRING狀態(tài),在該狀態(tài)下對(duì)單個(gè)字符串循環(huán)進(jìn)行單個(gè)字符的匹配處理;字符編碼連接類型終結(jié)符FIRST_CODE_UST狀態(tài),在該狀態(tài)下對(duì)字符編碼連接循環(huán)進(jìn)行單個(gè)字符的匹配處理;首終結(jié)符集合匹配成功FIRST_SUCCESS狀態(tài)和首終結(jié)符集合匹配失敗FIRST_FAIL狀態(tài),在該狀態(tài)下通知主進(jìn)程處理部分匹配處理結(jié)果。
所述的匹配后繼終結(jié)符部分包括
列表循環(huán)處理LIST_LOOP狀態(tài),在該狀態(tài)下判斷編碼類型為字符串 字符編碼連接;字符串類型FOLLOW_STRING狀態(tài),在該狀態(tài)下對(duì)單個(gè)字符串循環(huán)進(jìn)行單個(gè)字符的匹配處理;字符編碼連接類型FOLLOW_CODE_LIST狀態(tài),在該狀態(tài)下對(duì)字符編碼連接循環(huán)進(jìn)行單個(gè)字符的匹配處理;后繼終結(jié)符匹配成功FOLLOW_SUCCESS狀態(tài)和后繼終結(jié)符匹配失敗FOLLOW_FAIL狀態(tài),在該狀態(tài)下通知主進(jìn)程處理部分匹配處理結(jié)果。
由上述本發(fā)明提供的技術(shù)方案可以看出,本發(fā)明提供的基于FPGA硬件實(shí)現(xiàn)的通用ABNF文法解析與軟件實(shí)現(xiàn)方式相比,解析效率大為提高,有利于提高產(chǎn)品效率,降低成本。同時(shí),本發(fā)明為基于ABNF規(guī)則進(jìn)行解析,使得本發(fā)明具有良好的通用性,可以適用于各種基于ABNF進(jìn)行規(guī)則定義的場(chǎng)合,例如,對(duì)SIP協(xié)議棧、XML(可擴(kuò)展標(biāo)記語言)的處理等等;因此,本發(fā)明極大地降低了相應(yīng)的解析器的開發(fā)成本,提高了開發(fā)效率。
圖1為本發(fā)明所述的解析器的結(jié)構(gòu)示意圖;圖2為本發(fā)明所述的消息解析模塊的實(shí)現(xiàn)原理圖;圖3為圖2中的主進(jìn)程的狀態(tài)機(jī)模型;圖4為圖2中的解析終結(jié)符進(jìn)程的狀態(tài)機(jī)模型;圖5為圖2中的匹配首終結(jié)符進(jìn)程的狀態(tài)機(jī)模型;圖6為圖2中的匹配后繼終結(jié)符進(jìn)程的狀態(tài)機(jī)模型。
具體實(shí)施例方式
本發(fā)明的核心是基于FPGA(可編程邏輯芯片)實(shí)現(xiàn)的硬件ABNF解析器,所述硬件ABNF解析器可以在保證通用性的前提下,通過硬件優(yōu)化提高解析器的解碼效率。
本發(fā)明是在LL(1)算法的基礎(chǔ)上,提出一種FPGA實(shí)現(xiàn)的通用ABNF硬件解析器,可以對(duì)輸入字符串依據(jù)ABNF規(guī)則進(jìn)行解析。
本發(fā)明所述的基于FPGA實(shí)現(xiàn)的通用ABNF硬件解析器,其功能結(jié)構(gòu)如圖1所示,根據(jù)代表ABNF規(guī)則的規(guī)則樹信息(即未賦值的規(guī)則樹),對(duì)需要處理的字符串消息進(jìn)行解析,結(jié)果為已經(jīng)賦值的規(guī)則樹。
本發(fā)明所述的文本編碼類協(xié)議通用解析器主要包括規(guī)則樹存儲(chǔ)模塊、待解析消息存儲(chǔ)模塊和消息解析模塊組成,其中所述的規(guī)則樹存儲(chǔ)模塊用于存儲(chǔ)規(guī)則樹數(shù)據(jù),規(guī)則樹節(jié)點(diǎn)通常需要按順序存儲(chǔ),一次可以讀入整個(gè)規(guī)則節(jié)點(diǎn);所述的待解析消息存儲(chǔ)模塊用于存放待解析的消息文本,通??梢砸宰止?jié)形式順序存放;所述的消息解析模塊用于根據(jù)規(guī)則樹信息對(duì)待解析的消息文件進(jìn)行解碼處理,以獲得消息文件的解析處理結(jié)果。
本發(fā)明中主要涉及規(guī)則樹的生成過程和消息解析模塊的硬件實(shí)現(xiàn)方式,下面將分別對(duì)兩個(gè)主要方面進(jìn)行說明。
本發(fā)明中,所述的規(guī)則樹信息可以按如下方式從ABNF規(guī)則文本生成(1)對(duì)ABNF規(guī)則進(jìn)行展平處理,即將各規(guī)則進(jìn)行簡(jiǎn)化描述,使得其不包含增式選擇、序列組和可選序列等復(fù)雜結(jié)構(gòu),具體可以將簡(jiǎn)化描述后的規(guī)則保存于規(guī)則表中,每個(gè)表項(xiàng)對(duì)應(yīng)一個(gè)簡(jiǎn)化處理后的新的規(guī)則,相應(yīng)的處理步驟如下所述對(duì)于每個(gè)規(guī)則,在規(guī)則表(如哈希表)中添加一條規(guī)則表項(xiàng);對(duì)于包含增式選擇的規(guī)則,將規(guī)則添加的選擇內(nèi)容加入到原規(guī)則中,更新原規(guī)則表的表項(xiàng);
對(duì)于包含序列組的規(guī)則,將序列組內(nèi)容定義為新規(guī)則,并用新規(guī)則替換原規(guī)則的序列組內(nèi)容,重復(fù)此過程,直到新規(guī)則不包含序列組為止;對(duì)于包含可選序列的規(guī)則,將可選序列內(nèi)容定義為新規(guī)則,并用新規(guī)則替換原規(guī)則的可選序列內(nèi)容,重復(fù)此過程,直到新規(guī)則不包含序列組為止;(2)基于所述的規(guī)則表生成相應(yīng)的規(guī)則樹,具體為指定規(guī)則表中的某一規(guī)則為頂點(diǎn),并以此為根節(jié)點(diǎn)遞歸生成對(duì)應(yīng)的規(guī)則樹;(3)使用LL(1)解析算法中First集合和Follow集合的生成方法,對(duì)每個(gè)規(guī)則樹節(jié)點(diǎn)計(jì)算其相應(yīng)的First集合和Follow集合。
本發(fā)明中,所述的消息解析模塊為核心處理部分,下面將對(duì)所述的消息解析模塊的具體實(shí)現(xiàn)方式進(jìn)行詳細(xì)說明。
所述的消息解析模塊主要包括四個(gè)進(jìn)程,分別由四個(gè)狀態(tài)機(jī)實(shí)現(xiàn)。其中主進(jìn)程main控制其它三個(gè)子進(jìn)程,其它三個(gè)子進(jìn)程包括parse_term(解析終結(jié)符)進(jìn)程、match_first_proc(匹配first過程)和match_follow_proc(匹配follow過程),各進(jìn)程關(guān)系如圖2所示,由主進(jìn)程在處理過程中控制其他三個(gè)進(jìn)程的啟動(dòng),并實(shí)現(xiàn)相應(yīng)的功能;主進(jìn)程判斷符合啟動(dòng)相應(yīng)的子進(jìn)程的條件時(shí),則遷移到相應(yīng)的狀態(tài),向相應(yīng)的子進(jìn)程發(fā)送信號(hào)啟動(dòng)對(duì)應(yīng)的子進(jìn)程進(jìn)行相應(yīng)的處理,各子進(jìn)程處理完成后需要將結(jié)果返回主進(jìn)程,并由主進(jìn)程輸出成功或失敗的解析結(jié)果信號(hào)。
下面將分別對(duì)各個(gè)進(jìn)程的狀態(tài)機(jī)包括的狀態(tài)及具體處理過程進(jìn)行說明。
(1)主進(jìn)程main,即主進(jìn)程處理部分主進(jìn)程main作為主控進(jìn)程,由時(shí)鐘上升沿驅(qū)動(dòng),包含以下狀態(tài)IDLE(空閑),INIT(初始化),PARSE_LOOP(循環(huán)解析),REPEAT_MAX(到達(dá)最大重復(fù)次數(shù)),TERM_MATCH(匹配終結(jié)符),IN_FIRST(進(jìn)行FIRST集合判斷),F(xiàn)IRSTSUB(第一個(gè)子節(jié)點(diǎn)),ALLSUB(所有的子節(jié)點(diǎn)已經(jīng)處理),CHOOSESUB(選擇子節(jié)點(diǎn)),NEXTSUB0(下一個(gè)子節(jié)點(diǎn)0),NEXTSUB1(下一個(gè)子節(jié)點(diǎn)1),GETSUB(取子節(jié)點(diǎn)),JUDGE_FOLLOW(FOLLOW集判斷),IN_FOLLOW(進(jìn)入FOLLOW集合判斷),NEXTRULE(下一規(guī)則),END_PARSE(解析結(jié)束);其進(jìn)程狀態(tài)機(jī)模型如附圖3所示,相應(yīng)的狀態(tài)遷移處理過程為當(dāng)檢測(cè)到上升沿信號(hào)時(shí),狀態(tài)機(jī)由IDLE狀態(tài)進(jìn)入PARSE_LOOP狀態(tài),開始消息報(bào)文的解析;狀態(tài)機(jī)在REPEAT_MAX狀態(tài)判斷節(jié)點(diǎn)棧的棧頂節(jié)點(diǎn)的類型,所述的節(jié)點(diǎn)棧是在主進(jìn)程實(shí)現(xiàn)時(shí)的一個(gè)節(jié)點(diǎn)棧,保存的內(nèi)容是規(guī)則樹的節(jié)點(diǎn),用于跟蹤當(dāng)前基于相應(yīng)的規(guī)則樹的解析進(jìn)度情況,并根據(jù)棧頂節(jié)點(diǎn)的類型確定進(jìn)入相應(yīng)的子進(jìn)程進(jìn)行處理,參照?qǐng)D2所示,具體如下如果是終結(jié)節(jié)點(diǎn),則將終結(jié)符匹配信號(hào)match_term代入高電平,啟動(dòng)parse_term進(jìn)程,等待終結(jié)符匹配結(jié)果match_term_result信號(hào)出現(xiàn)高電平后進(jìn)入狀態(tài)TERM_MATCH,并將信號(hào)match_term代入低電平以中止parse_term進(jìn)程,狀態(tài)機(jī)返回PARSE_LOOP狀態(tài);如果棧頂節(jié)點(diǎn)是非終結(jié)節(jié)點(diǎn),則將信號(hào)match_first代入高電平,啟動(dòng)match_first_proc進(jìn)程,具體的處理過程為若match_first_success信號(hào)出現(xiàn)高電平,表示當(dāng)前待解析字符在節(jié)點(diǎn)的first集合中,狀態(tài)機(jī)進(jìn)入狀態(tài)FIRST_SUB,并把信號(hào)match_first代入低電平以中止match_first_proc進(jìn)程,此時(shí)狀態(tài)機(jī)選取正確的子節(jié)點(diǎn)壓入棧中并返回PARSE_LOOP狀態(tài);若match_first_fail信號(hào)出現(xiàn)高電平,表示當(dāng)前待解析字符不在節(jié)點(diǎn)的first集合中,狀態(tài)機(jī)進(jìn)入狀態(tài)JUDGE_FOLLOW狀態(tài),在此狀態(tài)下,信號(hào)match_follow被代入高電平,啟動(dòng)match_follow_proc進(jìn)程,等待matcn_follow_success信號(hào)或者match_follow_fail信號(hào)以判斷能否進(jìn)行下一節(jié)點(diǎn)的匹配,并返回PARSE_LOOP狀態(tài)。
(2)子進(jìn)程parse_term,即解析終結(jié)符進(jìn)程子進(jìn)程parse_term為時(shí)鐘上升沿驅(qū)動(dòng),用于完成終結(jié)節(jié)點(diǎn)的匹配,其對(duì)應(yīng)的狀態(tài)包括IDLE,START(啟動(dòng)),TERM_STRING(字符串類型終結(jié)符),TERM_CODE_LIST(字符編碼連接類型終結(jié)符),TERM_SUCCESS(終結(jié)符匹配成功),TERM_FAIL(終結(jié)符匹配失敗);其進(jìn)程狀態(tài)機(jī)模型如附圖4所示,當(dāng)match_term信號(hào)被主進(jìn)程代入高電平,狀態(tài)機(jī)由IDLE狀態(tài)進(jìn)入START狀態(tài),在此狀態(tài)下狀態(tài)機(jī)判斷編碼類型,以根據(jù)不同的編碼類型進(jìn)入不同的狀態(tài)進(jìn)行處理如果是字符串,則進(jìn)入TERM_STRING狀態(tài),循環(huán)匹配單個(gè)字符,那當(dāng)然,如果字符串僅包含單個(gè)字符編碼或者單個(gè)字符的range編碼,則直接判斷是否匹配即可;如果是字符編碼連接,則進(jìn)入TERM_CODE_LIST狀態(tài),循環(huán)進(jìn)行單個(gè)字符的匹配;最后,便可以根據(jù)匹配結(jié)果選擇進(jìn)入狀態(tài)TERM_SUCCESS或者TERM_FAIL,將term_match_result代入高電平通知主狀態(tài)機(jī);當(dāng)主狀態(tài)機(jī)將math_term置為低電平,則parse_term狀態(tài)機(jī)回到IDLE狀態(tài),清除term_match_result信號(hào)等待下一次匹配。
(3)子進(jìn)程match_first_proc,即匹配首終結(jié)符進(jìn)程進(jìn)程match_first_proc為時(shí)鐘上升沿驅(qū)動(dòng),用于比較當(dāng)前字符是否存在于節(jié)點(diǎn)first集合中,相應(yīng)的狀態(tài)包括IDLE,LIST_LOOP(列表循環(huán)處理),F(xiàn)IRST_STRING(字符串類型),F(xiàn)IRST_CODE_LIST(字符編碼連接類型),F(xiàn)IRST_SUCCESS(FIRST集合匹配成功),F(xiàn)IRST_FAIL(FIRST集合匹配失敗);其進(jìn)程狀態(tài)機(jī)模型如附圖5所示,相應(yīng)的狀態(tài)遷移處理過程為
當(dāng)match_first信號(hào)被主進(jìn)程代入高電平,狀態(tài)機(jī)由IDLE狀態(tài)進(jìn)入LIST_LOOP狀態(tài),在此狀態(tài)下狀態(tài)機(jī)判斷編碼類型,并根據(jù)編碼類型采用相應(yīng)的處理如果是字符串,則進(jìn)入FIRST_STRING狀態(tài),循環(huán)匹配單個(gè)字符;如果是單個(gè)字符編碼或者單個(gè)字符的range(有效范圍)編碼,則直接判斷是否匹配;如果是字符編碼連接,則進(jìn)入FIRST_CODE_LIST狀態(tài),循環(huán)匹配單個(gè)字符;最后,根據(jù)匹配結(jié)果選擇進(jìn)入狀態(tài)FIRST_SUCCESS或者回到LIST_LOOP匹配下一個(gè)列表內(nèi)容,直到發(fā)現(xiàn)匹配的first集合元素或者到達(dá)列表尾部;如果沒有發(fā)現(xiàn)匹配的first元素,則狀態(tài)機(jī)進(jìn)入FIRST_FAIL狀態(tài);狀態(tài)機(jī)在FIRST_SUCCESS和FIRST_FAIL分別把first_match_success和first_match_fail代入高電平通知主狀態(tài)機(jī);當(dāng)主狀態(tài)機(jī)將match_first置為低電平,則match_first_proc狀態(tài)機(jī)回到IDLE狀態(tài),清除match_first_success或match_first_fail信號(hào),并等待下一次匹配。
(4)子進(jìn)程match_follow_proc,即匹配后繼終結(jié)符處理進(jìn)程進(jìn)程match_follow_proc時(shí)鐘上升沿驅(qū)動(dòng),用于比較當(dāng)前字符是否存在于節(jié)點(diǎn)follow集合中,相應(yīng)的狀態(tài)包括IDLE,LIST_LOOP(列表循環(huán)處理),F(xiàn)OLLOW_STRING(字符串類型),F(xiàn)OLLOW_CODE_LIST(字符編碼連接類型),F(xiàn)OLLOW_SUCCESS(FOLLOW匹配成功),F(xiàn)OLLOW_FAIL(FOLLOW匹配失敗);其進(jìn)程狀態(tài)機(jī)模型如附圖6所示,相應(yīng)的狀態(tài)遷移處理過程為
當(dāng)match_follow信號(hào)被主進(jìn)程代入高電平,狀態(tài)機(jī)由IDLE狀態(tài)進(jìn)入LIST_LOOP狀態(tài),在此狀態(tài)下狀態(tài)機(jī)判斷編碼類型,同樣需要根據(jù)編碼類型進(jìn)行不同的處理如果是字符串,則進(jìn)入FOLLOW_STRING狀態(tài),循環(huán)匹配單個(gè)字符;如果是單個(gè)字符編碼或者單個(gè)字符的range編碼,則直接判斷是否匹配;如果是字符編碼連接,則進(jìn)入FOLLOW_CODE_LIST狀態(tài),循環(huán)匹配單個(gè)字符;最后,根據(jù)匹配結(jié)果選擇進(jìn)入狀態(tài)FOLLOW_SUCCESS或者回到LIST_LOOP匹配下一個(gè)列表內(nèi)容,直到發(fā)現(xiàn)匹配的FOLLOW集合元素或者到達(dá)列表尾部;如果沒有發(fā)現(xiàn)匹配的FOLLOW元素,則狀態(tài)機(jī)進(jìn)入FOLLOW_FAIL狀態(tài);狀態(tài)機(jī)在FOLLOW_SUCCESS和FOLLOW_FAIL分別將follow_match_success和follow_match_fail代入高電平通知主狀態(tài)機(jī);當(dāng)主狀態(tài)機(jī)將match_follow置為低電平,則match_follow_proc狀態(tài)機(jī)回到IDLE狀態(tài),清除match_follow_success或match_follow_fail信號(hào),等待下一次匹配。
基于上述各狀態(tài)機(jī),則可以利用可編程邏輯器件實(shí)現(xiàn)通用的ABNF文法解析器。
以上所述,僅為本發(fā)明較佳的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.一種文本編碼類協(xié)議通用解析器,其特征在于,包括規(guī)則存儲(chǔ)模塊、待解析消息存儲(chǔ)模塊和消息解析模塊,消息解析模塊根據(jù)規(guī)則存儲(chǔ)模塊中保存的規(guī)則信息對(duì)待解析消息存儲(chǔ)模塊中的消息文本進(jìn)行解析處理,所述的消息解析模塊為采用邏輯芯片實(shí)現(xiàn)。
2.根據(jù)權(quán)利要求1所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的邏輯芯片包括現(xiàn)場(chǎng)可編程邏輯門列陣FPGA或復(fù)雜可編程邏輯器件CPLD。
3.根據(jù)權(quán)利要求1所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的規(guī)則存儲(chǔ)模塊為規(guī)則樹存儲(chǔ)模塊,規(guī)則樹存儲(chǔ)模塊中保存有基于擴(kuò)展巴克斯范式ABNF方法定義的規(guī)則生成的規(guī)則樹。
4.根據(jù)權(quán)利要求3所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的規(guī)則樹為不包含增式選擇、序列組及可選序列結(jié)構(gòu)的規(guī)則樹,且所述的規(guī)則樹為以各規(guī)則中的一個(gè)規(guī)則為頂點(diǎn),采用遞歸的方式生成的規(guī)則樹。
5.根據(jù)權(quán)利要求1、2、3或4所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的消息解析模塊進(jìn)一步包括主進(jìn)程處理部分用于根據(jù)棧頂節(jié)點(diǎn)的類型控制分別進(jìn)入解析終結(jié)符部分、匹配首終結(jié)符部分或匹配后繼終結(jié)符部分的處理過程;解析終結(jié)符部分用于當(dāng)棧頂結(jié)點(diǎn)為終結(jié)節(jié)點(diǎn)時(shí),由主進(jìn)程處理部分控制啟動(dòng),并進(jìn)行終結(jié)節(jié)點(diǎn)的終結(jié)符的解析處理,解析完成后通知主進(jìn)程處理部分;匹配首終結(jié)符部分用于對(duì)當(dāng)棧頂結(jié)點(diǎn)為非終結(jié)點(diǎn)時(shí),且為首終結(jié)符集合時(shí),由主進(jìn)程處理部分控制啟動(dòng),并進(jìn)行首終結(jié)符的匹配處理,判斷當(dāng)前字符是否在節(jié)點(diǎn)首終結(jié)符集合內(nèi),匹配完成后通知主進(jìn)程處理部分;匹配后繼終結(jié)符部分用于對(duì)當(dāng)棧頂結(jié)點(diǎn)為非終結(jié)點(diǎn)時(shí),且為后繼終結(jié)符集合時(shí),由主進(jìn)程處理部分控制啟動(dòng),并進(jìn)行后繼終結(jié)符的匹配處理,判斷當(dāng)前字符是否在節(jié)點(diǎn)后繼終結(jié)符集合內(nèi),匹配完成后通知主進(jìn)程處理部分。
6.根據(jù)權(quán)利要求5所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的消息解析模塊采用狀態(tài)機(jī)實(shí)現(xiàn)。
7.根據(jù)權(quán)利要求6所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的主進(jìn)程處理部分對(duì)應(yīng)的狀態(tài)機(jī)包括循環(huán)解析PARSE_LOOP狀態(tài),在該狀態(tài)下進(jìn)行消息報(bào)文的解析;到達(dá)最大重復(fù)次數(shù)REPEAT_MAX狀態(tài),在該狀態(tài)下判斷保存首規(guī)則樹節(jié)點(diǎn)的節(jié)點(diǎn)棧的棧頂節(jié)點(diǎn)的類型是否為終結(jié)節(jié)點(diǎn);匹配終結(jié)符TERM_MATCH狀態(tài),在該狀態(tài)下進(jìn)行終結(jié)符的匹配處理張,并啟動(dòng)解析終結(jié)符部分;進(jìn)入首終結(jié)符集合判斷IN_FIRST狀態(tài),在該狀態(tài)下進(jìn)行首終結(jié)符集合的判斷處理,并在確定存在首終結(jié)符集合時(shí),啟動(dòng)匹配首終結(jié)符部分;所有的子節(jié)點(diǎn)已經(jīng)處理ALLSUB狀態(tài),當(dāng)IN_FIRST狀態(tài)下所有的子節(jié)點(diǎn)處理完成時(shí)進(jìn)入該狀態(tài),且在該狀態(tài)下返回PARSE_LOOP狀態(tài);后繼終結(jié)符集判斷JUDGE_FOLLOW狀態(tài),在該狀態(tài)下進(jìn)行后繼終結(jié)符集合的判斷處理,并在確定存在后繼終結(jié)符集合時(shí),進(jìn)入FOLLOW集合判斷IN_FOLLOW狀態(tài),啟動(dòng)匹配后繼終結(jié)符部分,如果不存在后繼終結(jié)符集合時(shí)進(jìn)入下一規(guī)則NEXTRULE狀態(tài),并返回PARSE_LOOP狀態(tài)的。
8.根據(jù)權(quán)利要求6所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的解析終結(jié)符部分的狀態(tài)機(jī)包括字符串類型終結(jié)符TERM_STRING狀態(tài),在該狀態(tài)下對(duì)單個(gè)字符串循環(huán)進(jìn)行單個(gè)字符的匹配處理;字符編碼連接類型終結(jié)符TERM_CODE_LIST狀態(tài),在該狀態(tài)下對(duì)字符編碼連接循環(huán)進(jìn)行單個(gè)字符的匹配處理;終結(jié)符匹配成功TERM_SUCCESS狀態(tài)和終結(jié)符匹配失敗TERM_FAIL狀態(tài),在該狀態(tài)下通知主進(jìn)程處理部分匹配處理結(jié)果。
9.根據(jù)權(quán)利要求6所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的匹配首終結(jié)符部分的狀態(tài)機(jī)包括列表循環(huán)處理LIST_LOOP狀態(tài),在該狀態(tài)下判斷編碼類型為字符串字符編碼連接;字符串類型FIRST_STRING狀態(tài),在該狀態(tài)下對(duì)單個(gè)字符串循環(huán)進(jìn)行單個(gè)字符的匹配處理;字符編碼連接類型終結(jié)符FIRST_CODE_LIST狀態(tài),在該狀態(tài)下對(duì)字符編碼連接循環(huán)進(jìn)行單個(gè)字符的匹配處理;首終結(jié)符集合匹配成功FIRST_SUCCESS狀態(tài)和首終結(jié)符集合匹配失敗FIRST_FAIL狀態(tài),在該狀態(tài)下通知主進(jìn)程處理部分匹配處理結(jié)果。
10.根據(jù)權(quán)利要求6所述的文本編碼類協(xié)議通用解析器,其特征在于,所述的匹配后繼終結(jié)符部分包括列表循環(huán)處理LIST_LOOP狀態(tài),在該狀態(tài)下判斷編碼類型為字符串字符編碼連接;字符串類型FOLLOW_STRING狀態(tài),在該狀態(tài)下對(duì)單個(gè)字符串循環(huán)進(jìn)行單個(gè)字符的匹配處理;字符編碼連接類型FOLLOW_CODE_LIST狀態(tài),在該狀態(tài)下對(duì)字符編碼連接循環(huán)進(jìn)行單個(gè)字符的匹配處理;后繼終結(jié)符匹配成功FOLLOW_SUCCESS狀態(tài)和后繼終結(jié)符匹配失敗FOLLOW_FAIL狀態(tài),在該狀態(tài)下通知主進(jìn)程處理部分匹配處理結(jié)果。
全文摘要
本發(fā)明涉及一種文本編碼類協(xié)議通用解析器。本發(fā)明包括規(guī)則存儲(chǔ)模塊、待解析消息存儲(chǔ)模塊和消息解析模塊,消息解析模塊根據(jù)規(guī)則存儲(chǔ)模塊中保存的ABNF規(guī)則樹信息對(duì)待解析消息存儲(chǔ)模塊中的消息文本進(jìn)行解析處理,所述消息解析模塊為基于FPGA(可編程邏輯芯片)實(shí)現(xiàn)。因此,本發(fā)明與軟件實(shí)現(xiàn)方式相比,解析效率大為提高,有利于提高產(chǎn)品效率,降低成本。同時(shí),本發(fā)明為基于ABNF規(guī)則進(jìn)行解析,使得本發(fā)明具有良好的通用性,可以適用于各種基于ABNF進(jìn)行規(guī)則定義的場(chǎng)合,從而極大地降低了相應(yīng)的解析器的開發(fā)成本,提高了開發(fā)效率。
文檔編號(hào)H04L29/06GK1809053SQ20051000178
公開日2006年7月26日 申請(qǐng)日期2005年1月21日 優(yōu)先權(quán)日2005年1月21日
發(fā)明者趙寶華, 屈玉貴, 周顥, 田野, 王爍, 李奇越, 呂超, 靳志偉 申請(qǐng)人:華為技術(shù)有限公司, 中國科學(xué)技術(shù)大學(xué)