李金友,于江濤
(通化師范學(xué)院 計(jì)算機(jī)學(xué)院,吉林 通化 134002)
基于OOAPN模型的代碼逆向生成*
李金友,于江濤
(通化師范學(xué)院 計(jì)算機(jī)學(xué)院,吉林 通化 134002)
基于OOAPN模型的代碼逆向生成旨在為人們利用自定義的模式,匹配出符合要求的格式數(shù)據(jù),再經(jīng)過逆向代碼生成器的加工轉(zhuǎn)換,使其轉(zhuǎn)變成符合nameSpace數(shù)據(jù)結(jié)構(gòu)類型的數(shù)據(jù),再由CIL加工還原成OOAPN模型.
OOAPN模型;模型驅(qū)動(dòng); 模板引擎;逆向代碼生成
Petri網(wǎng)(PetriNet)是一種高效的建模和分析工具,近年來得到了快速的發(fā)展.但是Petri網(wǎng)是一種純理論工具,并不能適合所有領(lǐng)域的應(yīng)用需求.很多學(xué)者針對(duì)不同領(lǐng)域的研究對(duì)象,提出了各種各樣改進(jìn)的Petri網(wǎng)理論.如近年來得到普遍應(yīng)用的隨機(jī)Petri網(wǎng)、著色Petri網(wǎng)、模糊Petri網(wǎng)、代數(shù)Petri網(wǎng)、面向?qū)ο驪etri網(wǎng)和面向?qū)ο蟠鷶?shù)Petri網(wǎng)模型等.
面向?qū)ο蟠鷶?shù)Petri網(wǎng)模型OOAPN(ObjectOrientedPetriNet)模型支持面向?qū)ο蟮母拍?,支持面向?qū)ο筌浖到y(tǒng)分析和建模,把代數(shù)理論、Petri理論以及面向?qū)ο蠓椒ê图夹g(shù)結(jié)合在一起,為形式化和智能化軟件工程環(huán)境的建立提供了一種有效方法,可以提高并發(fā)系統(tǒng)動(dòng)態(tài)建模和復(fù)雜系統(tǒng)的高級(jí)建模的能力,實(shí)現(xiàn)系統(tǒng)的動(dòng)態(tài)建模和不確定建模,完善現(xiàn)有建模方法的不足.
OOAPN模型建模工具旨在為人們提供一套科學(xué)的工程化的軟件開發(fā)工具系統(tǒng),有效的管理分析、設(shè)計(jì)、編碼和測(cè)試的全過程,生成高效、正確的代碼.集成化思想與建模工具緊密地結(jié)合在一起,形成了具有強(qiáng)有力的逆向代碼自動(dòng)生成的可編程和測(cè)試的集成化建模工具.OOAPN建模工具主要作用有:一個(gè)具有專用資源和早期查錯(cuò)功能的交互式開發(fā)環(huán)境、對(duì)軟件的開發(fā)和維護(hù)過程中的許多環(huán)節(jié)實(shí)現(xiàn)了自動(dòng)化、通過一個(gè)強(qiáng)有力的圖形接口,實(shí)現(xiàn)了直觀的程序設(shè)計(jì).
基于OOAPN模型的建模工具,提出了模型驅(qū)動(dòng)模板MDT(ModelDrivenTemplate)設(shè)計(jì)模式.模型驅(qū)動(dòng)模板MDT(ModelDrivenTemplate)設(shè)計(jì)模式主要包含兩個(gè)要素:模型和模板.而這兩個(gè)要素都是抽象的,即在實(shí)際開發(fā)中,可根據(jù)需要采用不同的模型和模板.在建模系統(tǒng)中,模型采用的是OOAPN模型,模板采用的是CheetahTemplates模板引擎,在中心信息庫(kù)CIL(CenterInformationLibrary)中,用逆向代碼生成器,利用自定義的模式,匹配出符合要求的格式數(shù)據(jù),再經(jīng)過逆向代碼生成器的加工轉(zhuǎn)換,使其轉(zhuǎn)變成符合nameSpace數(shù)據(jù)結(jié)構(gòu)類型的數(shù)據(jù),再由CIL加工廠還原成OOAPN模型.系統(tǒng)運(yùn)行界面如圖1所示.
圖1 是系統(tǒng)運(yùn)行的界面
逆向代碼的自動(dòng)生成的主要構(gòu)件是正則表達(dá)式,利用自定義的模式,匹配出符合要求的格式數(shù)據(jù),再經(jīng)過逆向代碼生成器的加工轉(zhuǎn)換,使其轉(zhuǎn)變成符合nameSpace數(shù)據(jù)結(jié)構(gòu)類型的數(shù)據(jù),再由CIL加工廠還原成OOAPN模型.其系統(tǒng)結(jié)構(gòu)圖如圖2所示:
圖2 逆向代碼自動(dòng)生成過程
首先,構(gòu)造自定義的正則模式,以便匹配出符合要求的代碼,進(jìn)行下一步的轉(zhuǎn)換.如自定義的匹配函數(shù)(方法、事件)的正則模式:
#匹配表達(dá)式
patFunction=r"""
([^s]+s*|) # 函數(shù)返回值類型
([^s]+)# 函數(shù)名稱
s* # 空字符
( # 參數(shù)的左界
(s* # 空字符
([^s]+s*|)* # 參數(shù)類型
(([^s]+))* # 參數(shù)名稱
(,)* # 參數(shù)分隔符
)* # 多個(gè)參數(shù)
) # 參數(shù)的右界
s* # 空字符
; # 結(jié)束符
"""
其次,由逆向代碼生成器轉(zhuǎn)換成類型nameSpace數(shù)據(jù)結(jié)構(gòu)類型的數(shù)據(jù).如向一個(gè)已經(jīng)匹配的接口添加函數(shù)(方法、事件):
FunctionText=MatchesText[BreakText[BreakTextLen-1]["InterfaceStartPos"]:]
rFunction=re.compile(patFunction,re.VERBOSE) #Compileit
FunctionIterator=rFunction.finditer(FunctionText) #Matches
formatchFunctioninFunctionIterator:
FunText=matchFunction.group(0) #函數(shù)體
FunType=matchFunction.group(1) #函數(shù)返回值類型
FunName=matchFunction.group(2) #函數(shù)名稱
FunArgs= [] #函數(shù)的參數(shù)列表
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})
再次,由中心信息庫(kù)CIL(CenterInformationLibrary)對(duì)nameSpace加工轉(zhuǎn)換成OOAPN模型.如向已經(jīng)在畫布存在的接口圖形的一個(gè)函數(shù)添加參數(shù)模型:
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()
最后,由中心信息庫(kù)CIL(CenterInformationLibrary)對(duì)nameSpace加工轉(zhuǎn)換成有效的OOAPN模型.
集成化思想與建模工具緊密地結(jié)合在一起,形成了具有強(qiáng)有力的逆向代碼自動(dòng)生成的可編程和測(cè)試的集成化建模工具,有效的管理分析、設(shè)計(jì)、編碼和測(cè)試的全過程,生成高效、正確的模型.
[1]潘洪軍.面向?qū)ο蟠鷶?shù)Petri網(wǎng)[J].吉林大學(xué)學(xué)報(bào),2006(3).
[2]克萊普,等著.解析MDA[M]. 鮑志云,譯.人民郵電出版社,2004.
[3]袁崇義.Petri網(wǎng)原理與應(yīng)用[M].北京:電子工業(yè)出版社,1998.
[4]賈立新,薛鈞義,茹峰.采用模糊Petri網(wǎng)的形式化推理算法及其應(yīng)用[J].西安交通大學(xué)學(xué)報(bào),2003(12).
[5]叢佩政,任愛華.基于面向?qū)ο驪etri網(wǎng)的模型驅(qū)動(dòng)開發(fā)方法的研究[J].微計(jì)算機(jī)信息,2006(28).
(責(zé)任編輯:王前)
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號(hào).
TP
A
1008-7974(2014)01-0040-03
通化師范學(xué)院學(xué)報(bào)2014年1期