鄧 偉 , 石 煒
(1.通信信息控制和安全技術重點實驗室 浙江 嘉興 314033;2.中國電子科技集團公司第三十六研究所 浙江 嘉興 314033)
在復雜的通信系統設計過程中,設計者通常會將系統劃分為獨立的功能單元,單元之間通過接口相互連接,實現系統功能。一般來說,單元之間的物理連接會盡量采用同一種物理接口,但建立在物理接口之上的通信協議卻因單元提供功能的差別而各不相同。開發人員必須為每個單元開發相應的協議解析程序,從協議數據中提取出所需要的信息加以處理,完成單元的控制。
這些通信協議的構成通常很類似,其主要構成為幀數據,并且幀數據的格式內容大都包含地址、命令、參數、數據等信息。傳統的手工開發方式需要針對每條協議編寫相應的解析程序,使得系統開發人員的主要精力無法集中在系統功能本身。針對這種情況,研究人員提出了遠程過程調用(RPC)機制試圖解決這一問題,但RPC的實現通常需要系統提供操作系統和TCP/IP協議棧[1-2],這無疑增加了系統開發的難度;此外,一些簡單的單元的接口控制邏輯通常是由低端的單片機構成,無法提供RPC機制所需的運行環境。這極大地限制了RPC機制的應用范圍。相關文獻[3]指出,可以通過采用編譯技術來完成協議的解析和識別,但該文獻提出的方案的需要宿主機提供解釋性語言的支持,如VB、Python等語言,這些解釋性語言通常在大多數單元中并不存在。
筆者針對上述解決方案的不足,提出了一種接近于幀協議文本的幀協議描述語言,并利用編譯技術實現了一種自動化解析器,該解析器將幀協議描述語言自動轉換為標準C語言的數據類型,并生成相應的解析函數和釋放函數。利用該方案,開發人員只需要針對協議文本中的幀結構編寫相應的幀協議描述說明,自動化解析器可根據幀協議描述說明自動生成相應的解析程序。開發人員調用生成的解析函數,即可提取出幀數據中包含的信息。該方案相對于RPC機制,減少了對系統環境的需求,極大地擴展了該方案的適用性。
文中設計的協議自動化解析器主要包括幀協議語言、詞法分析器、語法分析器、語義分析等,協議自動化解析器的工作流程如圖1所示。

圖1 協議自動化解析器工作流程Fig.1 Working flow of automatic protocol analyzer
協議自動解析器首先對幀格式描述語言進行詞法分析和語法分析,根據分析結果生成標準C語言的數據結構定義和幀數據的解析函數。由于在幀數據的解析的過程中,需要動態的分配系統內存,因此自動化解析器還生成了對應的內存釋放函數。這樣避免了開發人員手工編寫內存釋放代碼可能存在的內存泄露問題。將自動化解析器生成的C代碼通過C編譯器編譯變為可執行代碼。當某幀數據到達時,利用可執行代碼即可完成幀協議的解析,并提取相應的信息,復制到幀數據C語言結構體相關域,應用程序通過訪問該結構體即可完成信息的訪問。
文中設計的幀協議描述語言是為了描述常用的通信協議而提出的一種專用描述語言,通過該語言可使設計人員方便的描述通信幀結構。幀協議描述語言主要包括詞法部分和語法部分。詞法主要包括對幀協議語言所使用的關鍵字和保留符號的描述。為了使設計的描述語言符合開發人員慣用的方式,文中定義了6類關鍵字和4類保留符號,如表1所示。

表1 幀描述語言中的關鍵字和保留符號Tab.1 Keywords and reserved symbols in frame description language
幀協議描述語言語法部分采用了常見的上下文無關文法來定義。文中設計的幀協議描述語言的主要語法元素包括幀、域、變量和數組,具體的語法結構定義如表2所示。

表2 幀描述語言的語法元素Tab.2 Syntax element in frame description language
Flex是lex工具的開源版本[4],它的主要功能是根據用戶定義的詞法規則,生成面向字符流的自動掃描程序,將字符流分解為獨立的token和token所對應的詞法屬性。采用flex編寫的詞法分析程序主要包括3部分,每一部分用%%號分開。其中第一部分為引用的頭文件,變量聲明等;第二部分為詞法規則定義的部分;第三部分為用戶定義的函數。每個詞法規則都由模式和動作兩部分構成。其中模式部分采用正則表達式來定義,當字符流中出現了符合該正則表達式的部分時,詞法掃描程序將執行該模式對應的動作。
幀協議描述語言詞法分析主要包括對描述語言所定義的關鍵字、保留符號和合法標志符的識別,其部分flex程序如下:

上述程序通過flex工具編譯并生成詞法分析程序后,即可對幀協議語言進行詞法分析,該程序遇到int等關鍵字,會返回該關鍵字屬性;在遇到合法標志符時,會將yytext中該標志字符串復制到yylval.idName域中,返回變量屬性;在遇到整型字符串時,會將yytext中的字符串轉為整型,賦值到yylval.iVal域中,返回整型屬性。
Bison工具作為yacc的開源版本[4],主要功能是根據用戶定義的上下文無關文法來描述語言規則,從而生成語法分析的程序。Bison程序的結構與flex類似,同樣采用%%將文件分為3部分,第一部分包含頭文件聲明、函數聲明等;第二部分包括所有的語法規則表達式,也是語法分析的主要部分;第三部分是用戶自定義函數,主要包含幀協議描述文件的打開、關閉,輸出文件的創建等工作。
幀協議描述語言的bison文件的規則部分是主要構成部分。bison文件的規則部分將幀協議語法描述為一套產生規則,每條規則都由

它表示一個通信幀由幀名稱和一個或多個域構成,對應的動作是生成這條通信幀的C語言結構體的定義。幀描述語言完整的規則部分如下:

Bison語法分析程序采用LALR分析方法[5-6]將詞法分析程序返回的token序列與給定的語法規則匹配,并依據匹配的語法部分構建成相應的語法樹。在幀語言文件分析結束后,相對應的語法樹也已建立,此時語法分析階段結束,由主程序調用語義分析函數完成幀協議分析函數的生成。
幀協議描述語言的語義分析部分主要是從根節點遍歷語法部分構成的語法樹,并根據樹中每個節點的不同類型,產生相應的標準C代碼。語義部分通過3次遍歷語法樹,分別產生幀結構定義,幀數據解析函數和幀數據釋放函數。
將文中設計的協議自動化解析器應用到某通信系統單元中,該單元的授時幀格式如表3所示。

表3 授時協議Tab.3 Time sync protocol
根據表3,可采用協議描述語言將授時幀描述如下:


將輸出的文件通過C編譯器編譯,編譯順利通過。該試驗結果顯示,協議自動化解析器生成的C代碼可以取代手工代碼開發,應用程序通過調用time_sync_frame_anaylze_fn函數即可完成授時幀的解析,并在函數返回后可直接訪問返回變量中的域,提取相關信息。如果授時幀協議有修改,開發人員只需要修改幀協議描述文件,自動化解析器將自動完成C代碼的生成,這極大地減少了開發人員的負擔。
文中開發自動化解析器可減少大量的代碼編寫工作,并且編碼的準確性有很大提高。針對通信幀協議的更新,開發人員只需要修改幀協議描述文件,這簡化了幀協議代碼的維護工作,降低了幀協議開發的難度,在通信協議軟件開發方面具有很強的實用性。
[1]Iseminger D.網絡連接服務開發人員參考庫RPC與WNet[M].3卷.北京:機械工業出版社,2001.
[2]許瓊,蔡文皓.一種嵌入式RPC的設計與實現[J].電子設計工程,2011(5):127-129.
XU Qiong,CAI Wen-hao.Design and implementation of embedded RPC[J].Electronic Design Engineering,2011(5):127-129.
[3]董立,趙恒永.基于編譯技術的協議解析方法[J].計算機工程,2007(11):66-68.
DONG Li,ZHAO Heng-yong.Protocol parsing method based on compiling technology[J].Computer Engineering,2007(11):66-68.
[4]利文.flex與bison[M].中文版.南京:東南大學出版社,2011.
[5]丁文魁,杜淑敏.編譯原理和技術[M].北京:電子工業出版社,2008.
[6]劉堅.編譯原理基礎[M].西安:西安電子科技大學出版社,2008.