李金友,于江濤
(通化師范學院 計算機學院,吉林 通化 134002)
基于OOAPN模型的代碼逆向生成*
李金友,于江濤
(通化師范學院 計算機學院,吉林 通化 134002)
基于OOAPN模型的代碼逆向生成旨在為人們利用自定義的模式,匹配出符合要求的格式數據,再經過逆向代碼生成器的加工轉換,使其轉變成符合nameSpace數據結構類型的數據,再由CIL加工還原成OOAPN模型.
OOAPN模型;模型驅動; 模板引擎;逆向代碼生成
Petri網(PetriNet)是一種高效的建模和分析工具,近年來得到了快速的發展.但是Petri網是一種純理論工具,并不能適合所有領域的應用需求.很多學者針對不同領域的研究對象,提出了各種各樣改進的Petri網理論.如近年來得到普遍應用的隨機Petri網、著色Petri網、模糊Petri網、代數Petri網、面向對象Petri網和面向對象代數Petri網模型等.
面向對象代數Petri網模型OOAPN(ObjectOrientedPetriNet)模型支持面向對象的概念,支持面向對象軟件系統分析和建模,把代數理論、Petri理論以及面向對象方法和技術結合在一起,為形式化和智能化軟件工程環境的建立提供了一種有效方法,可以提高并發系統動態建模和復雜系統的高級建模的能力,實現系統的動態建模和不確定建模,完善現有建模方法的不足.
OOAPN模型建模工具旨在為人們提供一套科學的工程化的軟件開發工具系統,有效的管理分析、設計、編碼和測試的全過程,生成高效、正確的代碼.集成化思想與建模工具緊密地結合在一起,形成了具有強有力的逆向代碼自動生成的可編程和測試的集成化建模工具.OOAPN建模工具主要作用有:一個具有專用資源和早期查錯功能的交互式開發環境、對軟件的開發和維護過程中的許多環節實現了自動化、通過一個強有力的圖形接口,實現了直觀的程序設計.
基于OOAPN模型的建模工具,提出了模型驅動模板MDT(ModelDrivenTemplate)設計模式.模型驅動模板MDT(ModelDrivenTemplate)設計模式主要包含兩個要素:模型和模板.而這兩個要素都是抽象的,即在實際開發中,可根據需要采用不同的模型和模板.在建模系統中,模型采用的是OOAPN模型,模板采用的是CheetahTemplates模板引擎,在中心信息庫CIL(CenterInformationLibrary)中,用逆向代碼生成器,利用自定義的模式,匹配出符合要求的格式數據,再經過逆向代碼生成器的加工轉換,使其轉變成符合nameSpace數據結構類型的數據,再由CIL加工廠還原成OOAPN模型.系統運行界面如圖1所示.

圖1 是系統運行的界面
逆向代碼的自動生成的主要構件是正則表達式,利用自定義的模式,匹配出符合要求的格式數據,再經過逆向代碼生成器的加工轉換,使其轉變成符合nameSpace數據結構類型的數據,再由CIL加工廠還原成OOAPN模型.其系統結構圖如圖2所示:

圖2 逆向代碼自動生成過程
首先,構造自定義的正則模式,以便匹配出符合要求的代碼,進行下一步的轉換.如自定義的匹配函數(方法、事件)的正則模式:
#匹配表達式
patFunction=r"""
([^s]+s*|) # 函數返回值類型
([^s]+)# 函數名稱
s* # 空字符
( # 參數的左界
(s* # 空字符
([^s]+s*|)* # 參數類型
(([^s]+))* # 參數名稱
(,)* # 參數分隔符
)* # 多個參數
) # 參數的右界
s* # 空字符
; # 結束符
"""
其次,由逆向代碼生成器轉換成類型nameSpace數據結構類型的數據.如向一個已經匹配的接口添加函數(方法、事件):
FunctionText=MatchesText[BreakText[BreakTextLen-1]["InterfaceStartPos"]:]
rFunction=re.compile(patFunction,re.VERBOSE) #Compileit
FunctionIterator=rFunction.finditer(FunctionText) #Matches
formatchFunctioninFunctionIterator:
FunText=matchFunction.group(0) #函數體
FunType=matchFunction.group(1) #函數返回值類型
FunName=matchFunction.group(2) #函數名稱
FunArgs= [] #函數的參數列表
ArgsText=FunText[FunText.find("(")+1:FunText.find(")")]
ArgsList=ArgsText.split(",")
forArginArgsList:
ArgText=string.strip(Arg)
ArgList=ArgText.split(" ")
iflen(ArgList) == 2 :
FunArgs.append({'FunArgType':ArgList[0],'FunArgName':ArgList[1]})
InterfaceDict["Functions"].append(
{'FunType':FunType,'FunName':FunName,'FunArgs':FunArgs})
再次,由中心信息庫CIL(CenterInformationLibrary)對nameSpace加工轉換成OOAPN模型.如向已經在畫布存在的接口圖形的一個函數添加參數模型:
forArgIndexinrange(ArgCount) :
TEM_ARG_POS_X=TEM_FUN_POS_X-39
TEM_ARG_POS_Y=TEM_FUN_POS_Y
ifArgIndex== 0andArgCount== 2:
TEM_ARG_POS_X=TEM_FUN_POS_X-39
TEM_ARG_POS_Y=TEM_FUN_POS_Y-20
elifArgIndex== 1andArgCount== 2:
TEM_ARG_POS_X=TEM_FUN_POS_X-39
TEM_ARG_POS_Y=TEM_FUN_POS_Y+20
objPlaceShape=PlaceShape()
dc=wx.ClientDC(canvas)
objPlaceShapeNewSID=self.OnGetCunSID()
objPlaceShape.SID=objPlaceShapeNewSID
objPlaceShape.PlaceShapeFrame.SID="Frame"+str(objPlaceShapeNewSID)
objPlaceShape.Type="PlaceInInterfaceShape"
objPlaceShape.Move(dc,TEM_ARG_POS_X,TEM_ARG_POS_Y)
evthandler=MyEvtHandler(self,objPlaceShape)
evthandler.SetShape(objPlaceShape)
evthandler.SetPreviousHandler(objPlaceShape.GetEventHandler())
objPlaceShape.SetEventHandler(evthandler)
objPlaceShape.AttName=nameSpace["Interfaces"][InterfaceIndex]
["Functions"][FunIndex]["FunArgs"][ArgIndex]["FunArgName"]
objPlaceShape.AttType=nameSpace["Interfaces"][InterfaceIndex]
["Functions"][FunIndex]["FunArgs"][ArgIndex]["FunArgType"]
objInterfaceShape.AddChild(objPlaceShape)
diagram.ShowAll(1)
canvas.Redraw(dc)
canvas.Refresh()
最后,由中心信息庫CIL(CenterInformationLibrary)對nameSpace加工轉換成有效的OOAPN模型.
集成化思想與建模工具緊密地結合在一起,形成了具有強有力的逆向代碼自動生成的可編程和測試的集成化建模工具,有效的管理分析、設計、編碼和測試的全過程,生成高效、正確的模型.
[1]潘洪軍.面向對象代數Petri網[J].吉林大學學報,2006(3).
[2]克萊普,等著.解析MDA[M]. 鮑志云,譯.人民郵電出版社,2004.
[3]袁崇義.Petri網原理與應用[M].北京:電子工業出版社,1998.
[4]賈立新,薛鈞義,茹峰.采用模糊Petri網的形式化推理算法及其應用[J].西安交通大學學報,2003(12).
[5]叢佩政,任愛華.基于面向對象Petri網的模型驅動開發方法的研究[J].微計算機信息,2006(28).
(責任編輯:王前)
Reverse Code Generation Based on OOAPN Model
LI Jin-you, YU Jiang-tao
(CollegeofComputerScience,TonghuaNormalUniversity,Tonghua,Jilin134002,China)
The reverse code generation based on the OOAPN model aims to use the custom pattern, matching the format data to meet the requirements, and through the processing conversion of reverse code generator to convert it into data in compliance with nameSpace data structure types, then by CIL processing revert to OOAPN model.
OOAPN model; model-driven; template engine; reverse code generation
2013-10-07
李金友(1972-),男,吉林通化人,碩士,副教授.
吉教科合字[2007]第216號.
TP
A
1008-7974(2014)01-0040-03