專利名稱:基于抽象語法樹和軟件產(chǎn)品特征的應(yīng)用軟件代碼提取方法
技術(shù)領(lǐng)域:
本發(fā)明屬于軟件產(chǎn)品線工程領(lǐng)域,具體涉及到一種基于抽象語法樹和軟件產(chǎn)品特征的應(yīng)用軟件代碼提取方法。
背景技術(shù):
隨著軟件規(guī)模和復雜度不斷提升,傳統(tǒng)的軟件開發(fā)模式已經(jīng)無法滿足在業(yè)務(wù)多變的環(huán)境下進行軟件開發(fā)的需求。針對單個應(yīng)用需求的傳統(tǒng)軟件開發(fā)模式不僅成本高、效率低下而且可維護性差,已經(jīng)無法適應(yīng)大規(guī)模應(yīng)用需求定制和多變的業(yè)務(wù)環(huán)境。作為一種實現(xiàn)大規(guī)模定制生產(chǎn)的軟件開發(fā)方法,軟件產(chǎn)品線工程在一定程度上解決這個問題,它的出現(xiàn)大大降低了開發(fā)成本,提高了產(chǎn)品質(zhì)量同時縮短了上市時間。這里,軟件產(chǎn)品線是指一系列處于特定領(lǐng)域、功能相似的軟件產(chǎn)品集合,這些產(chǎn)品共享一個公共的、可管理的特征集,這個特征集能滿足選定的市場或任務(wù)領(lǐng)域的特定需求,并按照預定義的方式從一個公共的核心資產(chǎn)集開發(fā)得到。遵循軟件產(chǎn)品線兩階段的開發(fā)原則,將開發(fā)過程劃分為:領(lǐng)域工程與應(yīng)用工程兩個階段。領(lǐng)域工程和應(yīng)用工程作為軟件產(chǎn)品線生命周期中兩個主要階段,分別承擔著具體產(chǎn)品開發(fā)過程中的不同任務(wù)。其中,領(lǐng)域工程通過對領(lǐng)域需求中的共性、可變性進行系統(tǒng)化的分析來創(chuàng)建可復用的軟件產(chǎn)品線平臺;應(yīng)用工程是生產(chǎn)具體應(yīng)用軟件系統(tǒng)的過程,可以通過提取符合具體應(yīng)用需求的領(lǐng)域軟件構(gòu)件實現(xiàn)應(yīng)用軟件的快速開發(fā)。
發(fā)明內(nèi)容
本發(fā)明針對現(xiàn)有技術(shù)的不足,提出了一種基于抽象語法樹和軟件產(chǎn)品特征的應(yīng)用軟件代碼提取方法。定義1:軟件產(chǎn)品線特征模型可規(guī)范化定義為一個三元組:
SPLFM = (SftSrsSl)
(I)Sf表示特征和特征組的集合,描述特征模型中的一組概念,即Sf =FuFG ;
F代表特征模型中的特征集合,并且有£ =(故,f eF,其中:①Id:特征的標記名稱;任何唯一且有意義的字符組合均可作為特征的標記名稱; Opt:特征的可選性;表示當前特征的父特征被綁定時,該特征是否必須被綁定;這里提到的父子關(guān)系是由特征間的精化關(guān)系引起的,精化關(guān)系將在第三節(jié)詳細介紹;如果當前特征的Opt屬性為真,則該特征是可選性的(Optional),否則就是強制的(Mandatory); Bound:特征的綁定狀態(tài);表示該特征當前是否已經(jīng)被作出綁定決策;如果Bound屬性為,表示該特征處于綁定狀態(tài),即該特征所指代的軟件系統(tǒng)功能處于激活狀態(tài),否則就處于非綁定狀態(tài);
④ReEAsset:與該特征具有追溯關(guān)系的核心資 產(chǎn)(Core Assets)標識,本發(fā)明指的是直接實現(xiàn)了該特征的軟件構(gòu)件標識;代表特征模型中的特征組集合,F(xiàn)G= FGmU FGmkjFGqr ;
①FGam = m'D:與(And)特征組;PG爾中的特征成員可以是強制的(Mandatory),也可以是可選的(Optional),所以當父特征被包含在產(chǎn)品中時,與特征組中的強制特征必須包含在產(chǎn)品中,而可選特征則會根據(jù)進一步選擇來確定是否包含到產(chǎn)品中;
FGm = Ifii, J1,--.Jx):多選一(Alternative)特征組;J7G41 是一組多選一關(guān)系的特征,這組特征在其父特征出現(xiàn)的產(chǎn)品中僅有一個特征可以被選取;
③-1Z0 J1/J:或(Or)特征組;PGojs是一組或關(guān)系的特征,這組特征在其父特征出現(xiàn)的產(chǎn)品中至少應(yīng)有一個特征可以被選??;
(2)A表示特征模型中一組關(guān)系的集合,這些關(guān)系包括精化關(guān)系和約束關(guān)系,其中常見的約束關(guān)系有需要關(guān)系和排斥關(guān)系,因此涉及兩個特征的基本二元關(guān)系有:
精化關(guān)系(Parent):某個特征/能夠被分解成為一組組成特征…叉,表示Parent(Xjpi);
需要關(guān)系(Req):需要關(guān)系揭示了特征與特征之間的必要約束,即一個特征是實現(xiàn)另一個特征的前提和基礎(chǔ);特征需要特征石表示為ReqtZ1,/2);
排斥關(guān)系(Excl):排斥關(guān)系表示Z1,I2兩個特征之間的互斥關(guān)系,它意味著J1特征和
特征中只能有一個特征被選取,表示為Excl (J1 ,J2);
(3)&為軟件產(chǎn)品線特征模型中核心資產(chǎn)(Core Assets)的集合,主要包括需求、代碼和文檔,并通過統(tǒng)一的全局標識符對其進行標記;
定義2:AltSet(/)表示多選一特征集,它是/ \* MERGEFORMAT所在多選一特征組中除了自己以外所有特征的集合;
定義 3 =AndSet(Z) \* MERGEFORMAT表示與特征集,它是/ \* MERGEFORMAT所在與特征組中除了自己以外所有特征的集合;
定義4:0rSet(/) \* MERGEFORMAT表示或特征集,它是/ \* MERGEFORMAT所在或特征組中除了自己以外所有特征的集合;
定義5:ReqSet(/) \* mergeformat表示需要鏈集,它是與/ \* mergeformat存在需要關(guān)系或是因傳遞性而存在需要關(guān)系的所有特征的集合;
定義6 =EsdSet (J) \* MERGEFORMAT表示互斥鏈集,它是與/ \* MERGEFORMAT存在互斥關(guān)系或是因傳遞性而存在互斥關(guān)系的所有特征的集合;
定義7 =EastSeI (/) \* mergeformat表示已有關(guān)聯(lián)集合,它是與ast節(jié)點n已經(jīng)存在追溯關(guān)系的所有特征的集合;
定義8 =SelectedSet \* mergeformat表示與指定特征關(guān)聯(lián)的節(jié)點集合;
本發(fā)明方法具體包括如下步驟:
步驟1:輸入一個基于Java的軟件產(chǎn)品線特征模型對應(yīng)的特征樹(特征樹是指用樹形結(jié)構(gòu)表示特征之間的關(guān)系一種結(jié)構(gòu))、Java抽象語法樹以及指定的特征Id ;解析特征樹并確定特征樹中相應(yīng)的AndSet、AltSet、OrSet集合;
步驟2:解析軟件產(chǎn)品線特征模型中的約束關(guān)系,根據(jù)約束關(guān)系的可傳遞性確定軟件產(chǎn)品線特征模型中的需要鏈集合ReqSet和排斥鏈集合ExclSet (特征之間的約束關(guān)系作為一種靜態(tài)依賴關(guān)系,主要描述了特征之間因綁定時間的不同而造成的一種彼此相互約束的關(guān)系);
步驟3:根據(jù)軟件產(chǎn)品線特征模型中已有的特征與代碼塊的映射關(guān)系,確定已有關(guān)聯(lián)集合 ExistSet ;
步驟4:抽象語法樹中的所有節(jié)點均置為未選擇狀態(tài),初始化堆棧stack,并以抽象語法樹的根節(jié)點作為stack的初始元素集,將輸出節(jié)點集合SelectedSet置為空;
步驟5:如果stack不為空,則將棧頂節(jié)點出棧,并對該節(jié)點進行訪問操作;對節(jié)點的具體訪問操作為:
1)獲取當前抽象語法樹節(jié)點的起止位置,如果不在所選代碼段的范圍內(nèi)則直接跳轉(zhuǎn)到步驟6 ;
2)遍歷ExistSet集合并獲取當前節(jié)點已經(jīng)關(guān)聯(lián)的特征,然后判斷這些特征是否存在于指定特征對應(yīng)的AltSet集合或者ExclSet集合中,若存在,則發(fā)生核心資產(chǎn)不一致情況,直接跳轉(zhuǎn)到步驟6 ;
3)獲取當前抽象語法樹節(jié)點的父節(jié)點,如果當前節(jié)點與父節(jié)點起止位置相同,而且父節(jié)點已經(jīng)處于已選擇狀態(tài),則將父節(jié)點從SelectedSet集合中刪除,并將其置為未選擇狀態(tài),同時將當前節(jié)點放入SelectedSet集合中,置為選擇狀態(tài);否則,直接將當前節(jié)點放入SelectedSet集合中,并置 為選擇狀態(tài);
步驟6:獲取當前節(jié)點的所有子節(jié)點,如果子節(jié)點集合不為空,則將這些子節(jié)點依次放A stack中,重復執(zhí)行步驟5,直至stack為空;如果子節(jié)點集合為空,則直接跳轉(zhuǎn)步驟5,直至stack為空;
步驟7:返回當前指定特征關(guān)聯(lián)的節(jié)點集合SelectedSet。最后通過組裝SelectedSet節(jié)點集合對應(yīng)的節(jié)點代碼構(gòu)建具有應(yīng)用特征的應(yīng)用軟件系統(tǒng)。本發(fā)明的有益效果:本發(fā)明采用標準的抽象語法樹表示軟件產(chǎn)品的代碼結(jié)構(gòu),可以使得從特征到代碼的映射關(guān)系更加規(guī)范和精確,同時一次遍歷抽象語法樹即可自動獲取構(gòu)建應(yīng)用軟件的基本信息,其效率更高。
圖1基于抽象語法樹的軟件產(chǎn)品線特征代碼追溯方法執(zhí)行流程圖。
具體實施例方式下面結(jié)合附圖1進一步說明本發(fā)明提出的基于Java抽象語法樹和軟件產(chǎn)品特征的應(yīng)用軟件代碼提取方法的具體實施過程。輸入:軟件產(chǎn)品線特征模型對應(yīng)的特征樹,所選Java文件對應(yīng)的抽象語法樹,指定特征Id。輸出:與指定特征關(guān)聯(lián)的節(jié)點集合SelectedSet。
步驟1:遍歷軟件產(chǎn)品線特征模型對應(yīng)的特征樹,確定特征樹中與指定特征存在特征組關(guān)系的特征集合,分別構(gòu)成AndSet、AltSet、OrSet集合。步驟2:對軟件產(chǎn)品線特征模型中的約束關(guān)系進行分析,根據(jù)約束關(guān)系的可傳遞性確定軟件產(chǎn)品線特征模型中的需要鏈集合ReqSet和排斥鏈集合ExclSet。步驟3:解析軟件產(chǎn)品線特征模型中已有的特征與代碼塊的映射關(guān)系,確定已有的映射關(guān)系集合ExistSet。步驟4:將抽象語法樹中的所有節(jié)點均置為未選擇狀態(tài),初始化堆棧,將抽象語法樹的根節(jié)點入棧,并將與指定特征關(guān)聯(lián)的節(jié)點集合SelectedSet置空。步驟5:若棧不為空,則將棧頂節(jié)點出棧,并對該節(jié)點進行訪問操作。對節(jié)點的具體訪問操作為:
I)獲取當前抽象語法樹節(jié)點的起始位置和結(jié)束位置,如果不在所選的目標代碼段的范圍內(nèi)則直接跳轉(zhuǎn)到步驟6。2)遍歷ExistSet集合并獲取當前節(jié)點已經(jīng)關(guān)聯(lián)的特征,然后判斷這些特征是否存在于指定特征對應(yīng)的AltSet集合或者ExclSet集合中,若存在,則發(fā)生核心資產(chǎn)不一致情況,直接跳轉(zhuǎn)到步驟6。3)獲取當前抽象語法樹節(jié)點的父節(jié)點,如果當前節(jié)點與父節(jié)點的起始位置與結(jié)束位置相同,而且父親節(jié)點已經(jīng)處于已選擇狀態(tài),則將父親節(jié)點從SelectedSet集合中刪除,并將其置為未選擇狀態(tài),同時將當前節(jié)點放入SelectedSet集合中,置為選擇狀態(tài)。否則,直接將當前節(jié)點放入SelectedSet集合中,并置為選擇狀態(tài)。步驟6:獲取當前節(jié)點的所有子節(jié)點,如果子節(jié)點集合不為空,則將這些子節(jié)點依次放入棧中,重復執(zhí)行步·驟5,直至棧為空。如果子節(jié)點集合為空,則直接跳轉(zhuǎn)步驟5,直至棧為空。步驟7:返回當前指定特征關(guān)聯(lián)的節(jié)點集合SelectedSet。最后通過組裝SelectedSet節(jié)點集合對應(yīng)的節(jié)點代碼構(gòu)建具有應(yīng)用特征的應(yīng)用軟件系統(tǒng)。
權(quán)利要求
1.基于抽象語法樹和軟件產(chǎn)品特征的應(yīng)用軟件代碼提取方法, 定義1:軟件產(chǎn)品線特征模型可規(guī)范化定義為一個三元組:SPLFM = (SfjSrsS1) (I):表示特征和特征組的集合,描述特征模型中的一組概念,即Sf =FuFG ; F代表特征模型中的特征集合,并且有? =,f eF,其中: ①Id:特征的標記名稱;任何唯一且有意義的字符組合均可作為特征的標記名稱; Opt:特征的可選性;表示當前特征的父特征被綁定時,該特征是否必須被綁定;這里提到的父子關(guān)系是由特征間的精化關(guān)系引起的,精化關(guān)系將在第三節(jié)詳細介紹;如果當前特征的Opt屬性為真,則該特征是可選性的Optional,否則就是強制的Mandatory ;Bound:特征的綁定狀態(tài);表示該特征當前是否已經(jīng)被作出綁定決策;如果Bound屬性為,表示該特征處于綁定狀態(tài),即該特征所指代的軟件系統(tǒng)功能處于激活狀態(tài),否則就處于非綁定狀態(tài); ④RefAsset:與該特征具有追溯關(guān)系的核心資產(chǎn)Core Assets標識,本發(fā)明指的是直接實現(xiàn)了該特征的軟件構(gòu)件標識; FG代表特征1旲型中的特征組集合,F(xiàn)G= FGmKJ FGm u從; ①=:與And特征組;FG冊中的特征成員可以是強制的Mandatory,也可以是可選的Optional,所以當父特征被包含在產(chǎn)品中時,與特征組中的強制特征必須包含在產(chǎn)品中,而可選特征則會根據(jù)進一步選擇來確定是否包含到產(chǎn)品中; FGm = {.m》:多選一 Alternative特征組;FGf是一組多選一關(guān)系的特征,這組特征在其父特征出現(xiàn)的產(chǎn)品中僅有一個特征可以被選??; =:或Or特征組;PG05是一組或關(guān)系的特征,這組特征在其父特征出現(xiàn)的產(chǎn)品中至少應(yīng)有一個特征可以被選取; 4表示特征模型中一組關(guān)系的集合,這些關(guān)系包括精化關(guān)系和約束關(guān)系,其中常見的約束關(guān)系有需要關(guān)系和排斥關(guān)系,因此涉及兩個特征的基本~■兀關(guān)系有: 精化關(guān)系Parent:某個特征/能夠被分解成為一組組成特征/0./f Ii…/B ,表示Pa1-ent (JJi); 需要關(guān)系Req:需要關(guān)系揭示了特征與特征之間的必要約束,即一個特征是實現(xiàn)另一個特征的前提和基礎(chǔ);特征J1需要特征石表示為ReqtZ1,力); 排斥關(guān)系Excl:排斥關(guān)系表示J1,S2兩個特征之間的互斥關(guān)系,它意味著特征和特征中只能有一個特征被選取,表示為Eli (j;,/2); 4為軟件產(chǎn)品線特征模型中核心資產(chǎn)Core Assets的集合,主要包括需求、代碼和文檔,并通過統(tǒng)一的全局標識符對其進行標記; 定義2:AltSet(/)表示多選一特征集,它是所在多選一特征組中除了自己以外所有特征的集合; 定義3:表示與特征集,它是/所在與特征組中除了自己以外所有特征的集合; 定義4: OrSet(Z)表示或特征集,它是/所在或特征組中除了自己以外所有特征的集合; 定義5 =IeqSetCf)表示需要鏈集,它是與/存在需要關(guān)系或是因傳遞性而存在需要關(guān)系的所有特征的集合; 定義6: ExclSet (/)表示互斥鏈集,它是與存在互斥關(guān)系或是因傳遞性而存在互斥關(guān)系的所有特征的集合; 定義7: EsstSet (/)表示已有關(guān)聯(lián)集合,它是與AST節(jié)點n已經(jīng)存在追溯關(guān)系的所有特征的集合; 定義8: SelectedSet表示與指定特征關(guān)聯(lián)的節(jié)點集合; 其特征在于該方法具體包括如下步驟: 步驟1:輸入一個基于Java的軟件產(chǎn)品線特征模型對應(yīng)的特征樹、Java抽象語法樹以及指定的特征Id ;解析特征樹并確定特征樹中相應(yīng)的AndSet、AltSet、OrSet集合; 步驟2:解析軟件產(chǎn)品線特征模型中的約束關(guān)系,根據(jù)約束關(guān)系的可傳遞性確定軟件產(chǎn)品線特征模型中的需要鏈集合ReqSet和排斥鏈集合ExclSet ; 步驟3:根據(jù)軟件產(chǎn)品線特征模型中已有的特征與代碼塊的映射關(guān)系,確定已有關(guān)聯(lián)集合 ExistSet ; 步驟4:抽象語法樹中的所有節(jié)點均置為未選擇狀態(tài),初始化堆棧stack,并以抽象語法樹的根節(jié)點作為stack的初始元素集,將輸出節(jié)點集合SelectedSet置為空; 步驟5:如果stack不為空,則將棧頂節(jié)點出棧,并對該節(jié)點進行訪問操作;對節(jié)點的具體訪問操作為: 1)獲取當前抽象語法樹節(jié)點的起止位置,如果不在所選代碼段的范圍內(nèi)則直接跳轉(zhuǎn)到步驟6 ; 2)遍歷ExistSet集合并獲取當前節(jié)點已經(jīng)關(guān)聯(lián)的特征,然后判斷這些特征是否存在于指定特征對應(yīng)的AltSet集合或者ExclSet集合中,若存在,則發(fā)生核心資產(chǎn)不一致情況,直接跳轉(zhuǎn)到步驟6 ; 3)獲取當前抽象語法樹節(jié)點的父節(jié)點,如果當前節(jié)點與父節(jié)點起止位置相同,而且父節(jié)點已經(jīng)處于已選擇狀態(tài),則將父節(jié)點從SelectedSet集合中刪除,并將其置為未選擇狀態(tài),同時將當前節(jié)點放入SelectedSet集合中,置為選擇狀態(tài);否則,直接將當前節(jié)點放入SelectedSet集合中,并置為選擇狀態(tài); 步驟6:獲取當前節(jié)點的所有子節(jié)點,如果子節(jié)點集合不為空,則將這些子節(jié)點依次放A stack中,重復執(zhí)行步驟5,直至stack為空;如果子節(jié)點集合為空,則直接跳轉(zhuǎn)步驟5,直至stack為空; 步驟7:返回當前指定特征關(guān)聯(lián)的節(jié)點集合SelectedSet ;最后通過組裝SelectedSet節(jié)點集合對應(yīng)的節(jié)點代碼構(gòu)建具有應(yīng)用特征的應(yīng)用軟件系統(tǒng)。
全文摘要
本發(fā)明公開了一種基于抽象語法樹和軟件產(chǎn)品特征的應(yīng)用軟件代碼提取方法,目前已有的方法一般利用約定的編程規(guī)范,由于缺乏標準化,其可靠性一直得不到很好的保證,而且需要較多的人工干預。本發(fā)明根據(jù)已有的軟件產(chǎn)品線特征樹模型以及特征與領(lǐng)域構(gòu)件的追溯關(guān)系,從領(lǐng)域構(gòu)件中自動提取具有應(yīng)用軟件特征的軟件代碼,從而實現(xiàn)應(yīng)用軟件系統(tǒng)的快速構(gòu)建。本發(fā)明采用標準的抽象語法樹表示軟件產(chǎn)品的代碼結(jié)構(gòu),可以使得從特征到代碼的映射關(guān)系更加規(guī)范和精確,同時一次遍歷抽象語法樹即可自動獲取構(gòu)建應(yīng)用軟件的基本信息,其效率更高。
文檔編號G06F17/30GK103235723SQ201310144528
公開日2013年8月7日 申請日期2013年4月23日 優(yōu)先權(quán)日2013年4月23日
發(fā)明者邵建偉, 俞東進, 劉愉, 李萬清, 穆海倫 申請人:浙江天正思維信息技術(shù)有限公司, 杭州電子科技大學