王福印,呂常魁
(南京航空航天大學 機電學院,江蘇 南京 210016)
工業機器人解釋器是機器人軟件系統的關鍵組成部分。作為機器人控制系統與機器人語言的接口,解釋器負責讀取機器人源程序,并生成運動控制模塊所識別的目標數據。解釋器的效率與質量是影響機器人運行精度、實時性與穩定性的控制性因素[1]。
解釋器一般包括詞法分析、語法分析、語義分析3個基本邏輯環節。傳統詞法分析與語法分析一般是依次讀入單字符,將字符分成運算符、終結符和非終結符等,再按照一定的文法規則進行歸約,構造語法樹并識別語法錯誤;語義分析階段則通過遍歷語法樹來實現語法制導的翻譯過程[2],最終生成目標代碼。然而單字符讀取與語法樹遍歷的解釋模式往往導致解釋過程算法復雜,效率低下。
正則表達式采用直接匹配的解釋模式,具有開放性、高效性等特點,在機器人解釋器設計中被廣泛采用。如文獻[2]應用Linux系統自帶的regcomp()和regexec()正則表達式處理庫函數,完成機器人語言解釋器的語法分析;文獻[3]基于QT設計了機器人語言系統,采用QRegExp正則表達式規范機器人語言編輯格式,簡化了詞法分析、語法分析過程;文獻[4]在VC開發環境下,通過調用GREAT正則表達式模板類庫,對指令代碼進行語法分析。
本文基于PCRE正則表達式,提出兩遍掃描的解釋模式:在第一遍掃描中應用PCRE正則表達式完成程序指令的詞法、語法分析;第二遍掃描中采用雙向鏈表結構形式,管理程序中的每條指令,通過查關鍵字表跳轉到相應的處理函數,完成語義分析、信息提取及目標代碼的生成。實驗結果表明,解釋算法穩定可靠,具有較高的執行效率。
動作級機器人語言以控制指令和尺寸信息為主,每一行程序即為一條指令,形式簡單,格式固定。這一特征可以直接通過匹配完成語法分析,通過查詢關鍵字表,直接轉入行指令對應的處理模塊,實現快速語義分析。鑒于此,在解釋器的實現過程中,綜合考慮程序結構、執行效率和內存消耗等因素,采用兩遍掃描的方式[2,5-6]。其流程如圖1所示。
第一遍掃描只進行詞法和語法分析即錯誤檢測,不進行有關數據的處理。解釋器逐行讀取源程序,與初始化后的正則表達式進行整行匹配,若匹配有誤,說明程序指令存在語法錯誤,則對該指令進行詞法匹配,輸出錯誤信息。若指令沒有錯誤則進行第二遍掃描,完成語義分析、信息提取和目標代碼生成。兩遍掃描相互獨立,可單獨調用。

圖1 解釋器整體流程圖
正則表達式是由一系列普通字符和元字符組成的,能明確描述文本字符串的文字匹配模式[7]。PCRE是一個用C語言編寫的正則表達式函數庫,比Boost之類的正則表達式庫小得多,簡單易用,性能超過了POSIX正則表達式庫和一些經典的正則表達式庫。
PCRE在VS2010編譯環境下的配置過程十分方便,步驟如下:1) 新建篩選器,命名為pcre;2) 將PCRE軟件包頭文件及可執行文件添加至pcre文件夾;3) 將pcre中可執行文件屬性改為不使用預編譯頭;4) 修改工程屬性,添加宏“_DEBUG”和“HAVE_CONFIG_H”。
Pcre正則表達式提供了19個接口函數。本文采用PCRE進行語法、詞法分析時只需調用現有的IsMathch(const char *szPattern,const char *szSrc)函數,參數szPattern為宏定義的指令代碼字符串,參數szSrc為要匹配的指令代碼。若匹配成功,函數返回值>0,反之<0。該函數中已封裝了PCRE正則表達式的pcre_compile()和pcre_exec()接口函數,與傳統調用正則表達式的過程相比,實現方式簡單、編程難度明顯減小。
研究的語言屬于動作級機器人語言,結構清晰固定,如運動指令MOVJ P* ,V20 ,Z0 ;流程控制指令JUMP LAB0。此外,在工業機器人實際編程中通常以“選擇題式”輸入的方式編程,每一行的程序格式由指令編輯器軟件嚴格設定,這種形式有效避免了非字符及非法語法的產生。本文設計的指令窗口,如圖2所示。指令代碼由樹形控件管理,當雙擊選中的指令,指令將顯示在程序編輯窗口中。為檢查在參數修改過程中,人為因素帶來的詞法語法錯誤,本文提出利用PCRE正則表達式進行先語法后詞法的的快速檢查方法,其流程圖如圖3所示。
首先,解釋器根據PCRE正則表達式規則建立指令代碼的語法和詞法匹配表達式,并定義成宏的形式,再將語法匹配表達式裝載到數組中以備循環匹配。以運動指令MOVJ為例,定義其語法匹配的正則表達式如下:
#define PCRE_MOVJ “MOVJ (\s+)P\d{1,3}(\s*),(\s*)V(\d{1,2}|100)(\s+),\s*Z[0-4](\s+)”;對應的詞法匹配正則表達式為:#define PCRE_P “P\d{1,3}(\s+)”、#define PCRE_V “V(\d{1,2}|100)(\s+)”、#define PCRE_Z “Z[0-4](\s+);”。

圖2 指令窗口

圖3 第一遍掃描流程圖
初始化后,程序讀取一行代碼進行整體匹配。若匹配正確,則說明此行代碼語法正確,程序跳出循環進行下一行代碼匹配;若整體匹配有誤,則程序跳轉到該指令對應的處理函數完成詞法分析,并在輸出窗口輸出發生錯誤的行號和類型。然后讀取下一行代碼繼續匹配,直至代碼行為空,完成對全部指令程序的錯誤檢查。
第一遍掃描如果沒有錯誤則進行第二遍掃描完成語義分析、信息提取和目標代碼的生成。在此采用一個雙向鏈表結構管理源程序段,即鏈表中每一節點對應一行指令;鏈表結構如下:
Struct SProc_Codelist
{
int rowNum;
char comName[100];//指令代碼
int nType;// 指令關鍵字的宏定義
struct SProc_Codelist *front;
struct SProc_Codelist *next;
};
雙鏈表結構的特點是從雙鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后驅結點,使得上下級存在制約關系的指令代碼的分析變得簡單方便。語義檢查、信息提取和目標代碼的生成均通過讀取鏈表實現,分析流程圖如圖4所示。

圖4 第二遍掃描流程圖
nType用于存儲宏形式定義的指令關鍵字,如運動指令MOVJ的宏定義為:#define MOVJ 1。nType的值通過查找關鍵字數組表獲得。若讀取指令不為空,根據關鍵字調用相應的語義分析函數,若語義分析正確,則進行該指令代碼的信息提取并生成目標代碼;若語義分析有誤,則輸出錯誤信息,程序停止運行。本文對于每一種指令類型,都設計了對應的分析處理函數接口。結構形式如下:
switch(Codelist_p->nType)
{
case MOVJ:deal_Motion_MOVJ();break;
case MOVL:deal_Motion_MOVL();break;
case MOVC:deal_Motion_MOVC();break;
…
default:break;
}
圖5以VS2010作為開發工具實現的離線編程系統主界面,含三維視圖顯示窗口、指令選擇窗口、程序編輯窗口、運動控制窗口和信息輸出窗口。可以通過離線編程或導入源程序文件實現運動模擬。
為驗證該解釋器的有效性,應用上述系統對機器人指令進行了大量解釋試驗。結果顯示該解釋器能夠正確解釋機器人指令,當代碼出錯時,能夠正確輸出錯誤信息。在指令信息提取的正確性方面,以圖5所示的編輯代碼為例,結果顯示,機器人能夠正確按照指令實現運動模擬。在DOS環境下輸出解釋器提取的示教點信息和生成的目標代碼(圖6),與實際數據吻合。

圖5 離線仿真系統

圖6 指令代碼信息提取結果
針對工業機器人語言形式簡單、格式固定等特點,提出了兩遍掃描的解釋模式。基于PCRE正則表達式,采用先整體后局部的匹配方法完成首次掃描,實現了語法、詞法的快速檢測;為每一指令建立了相應處理函數,并生成了關鍵字表以便于函數查詢。二次掃描過程中,采用雙向鏈表結構形式進行指令管理,通過關鍵字表查詢快速跳轉至相應處理函數,完成語義分析、信息提取及目標代碼的生成。程序結構清晰,解釋算法簡單且各模塊相互獨立,易于維護。實驗結果表明,該解釋器能夠快速完成錯誤檢測,并可靠提取指令相關信息。
[1] 周澤湘, 丁躍澆,張敏. 工業機器人解釋器的研究與設計[J]. 機械設計與制造, 2012(12): 154-156.
[2] 郭顯金. 工業機器人編程語言的設計與實現[D]. 武漢:華中科技大學,2013.
[3] 楊杏,陳富林,周霏. 基于Qt的工業機器人語言系統的設計[J]. 組合機床與自動化加工技術,2015(3):71-74.
[4] 何嘉健,李偉光. 基于GRETA正則表達式的機器人解釋器的研究[J]. 組合機床與自動化加工技術,2012(1):17-19,24.
[5] 王浩,謝存禧. 開放式機器人解釋器的研究[J]. 機械設計與制造,2010(8) :167-168.
[6] 王浩. 基于XML的開放式工業機器人解釋器的研究[D]. 廣州:華南理工大學,2010.
[7] Jeffrey E.F.Friedl. 精通正則表達式[M]. 北京:電子工業出版社,2007.