本發(fā)明涉及計(jì)算機(jī)處理領(lǐng)域,特別是涉及一種條件編譯預(yù)處理方法和裝置。
背景技術(shù):
傳統(tǒng)POS應(yīng)用開(kāi)發(fā)普遍采用C語(yǔ)言進(jìn)行開(kāi)發(fā),C語(yǔ)言使一種編譯型高級(jí)語(yǔ)言,開(kāi)發(fā)人員可以充分利用條件編譯的特性,在同一個(gè)工程中支持多種軟/硬配置,但是當(dāng)應(yīng)用在跨平臺(tái)時(shí)必須分別生成各自平臺(tái)下的版本,而且開(kāi)發(fā)難度較大。解釋型語(yǔ)言(比如,WMLScript)可以做到跨平臺(tái),而且相對(duì)C語(yǔ)言來(lái)說(shuō),開(kāi)發(fā)難度較低,但是解釋型語(yǔ)言不具有條件編譯的特性。
在典型的POS軟件項(xiàng)目中,往往同一個(gè)項(xiàng)目需要支持多種配置,且這些機(jī)型應(yīng)用邏輯差異并不大,有了條件編譯就可以實(shí)現(xiàn)同一個(gè)工程支持不同配置,但是如果選擇解釋型語(yǔ)言作為開(kāi)發(fā)語(yǔ)言,由于不具有條件編譯功能,那么當(dāng)一套應(yīng)用要適用多種配置時(shí),要么復(fù)制代碼,各自建立工程,要么通過(guò)變量控制程序流程。而復(fù)制代碼的做法會(huì)造成維護(hù)成本高,通過(guò)變量控制的做法會(huì)增加資源的消耗。因此,亟待需要提出一種使得解釋型語(yǔ)言也能夠?qū)崿F(xiàn)條件編譯的方法。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要針對(duì)上述問(wèn)題,提出一種輕量的使得解釋型語(yǔ)言也能實(shí)現(xiàn)條件編譯的條件編譯預(yù)處理方法和裝置。
一種條件編譯預(yù)處理方法,所述方法包括:獲取待處理的原程序文本;對(duì)所述原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記;根據(jù)所述標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件;根據(jù)當(dāng)前狀態(tài)和所述事件確定相應(yīng)的處理動(dòng)作;根據(jù)確定的所述處理動(dòng)作對(duì)所述原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本。
在其中一個(gè)實(shí)施例中,所述根據(jù)當(dāng)前狀態(tài)和所述事件確定相應(yīng)的處理動(dòng)作的步驟包括:根據(jù)當(dāng)前狀態(tài)和所述事件確定下一步狀態(tài);根據(jù)所述下一步狀態(tài)確定相應(yīng)的處理動(dòng)作。
在其中一個(gè)實(shí)施例中,所述根據(jù)確定的所述處理動(dòng)作對(duì)所述原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本的步驟包括:將確定的所述處理動(dòng)作添加到動(dòng)作列表;根據(jù)所述動(dòng)作列表對(duì)所述原程序文本執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
在其中一個(gè)實(shí)施例中,所述根據(jù)所述標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件的步驟還包括:根據(jù)所述標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則進(jìn)行匹配,當(dāng)匹配到包含宏名稱(chēng)的條件語(yǔ)句時(shí),向宏定義管理器查詢(xún)與所述宏名稱(chēng)對(duì)應(yīng)的定義及相應(yīng)的值以進(jìn)行條件判斷,根據(jù)所述條件判斷的結(jié)果匹配出相應(yīng)的事件。
在其中一個(gè)實(shí)施例中,所述對(duì)所述原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記的步驟包括:對(duì)所述原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字,記錄所述關(guān)鍵字所在的行號(hào),輸出相應(yīng)的標(biāo)記和對(duì)應(yīng)的行號(hào);所述根據(jù)確定的所述處理動(dòng)作對(duì)所述原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本的步驟包括:根據(jù)所述處理動(dòng)作的類(lèi)型和對(duì)應(yīng)的行號(hào)執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
一種條件編譯預(yù)處理裝置,所述裝置包括:獲取模塊,用于獲取待處理的原程序文本;輸出模塊,用于對(duì)所述原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記;匹配模塊,用于根據(jù)所述標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件;確定模塊,用于根據(jù)當(dāng)前狀態(tài)和所述事件確定相應(yīng)的處理動(dòng)作;處理模塊,用于根據(jù)確定的所述處理動(dòng)作對(duì)所述原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本。
在其中一個(gè)實(shí)施例中,所述確定模塊還用于根據(jù)當(dāng)前狀態(tài)和所述事件確定下一步狀態(tài),根據(jù)所述下一步狀態(tài)確定相應(yīng)的處理動(dòng)作。
在其中一個(gè)實(shí)施例中,所述處理模塊還用于將確定的所述處理動(dòng)作添加到動(dòng)作列表,根據(jù)所述動(dòng)作列表對(duì)所述原程序文本執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
在其中一個(gè)實(shí)施例中,所述匹配模塊還用于根據(jù)所述標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則進(jìn)行匹配,當(dāng)匹配到包含宏名稱(chēng)的條件語(yǔ)句時(shí),向宏定義管理器查詢(xún)與所述宏名稱(chēng)對(duì)應(yīng)的定義及相應(yīng)的值以進(jìn)行條件判斷,根據(jù)所述條件判斷的結(jié)果匹配出相應(yīng)的事件。
在其中一個(gè)實(shí)施例中,所述輸出模塊還用于對(duì)所述原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字,記錄所述關(guān)鍵字所在的行號(hào),輸出相應(yīng)的標(biāo)記和對(duì)應(yīng)的行號(hào);所述處理模塊還用于根據(jù)所述處理動(dòng)作的類(lèi)型和對(duì)應(yīng)的行號(hào)執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
上述條件編譯預(yù)處理方法和裝置,通過(guò)對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記,然后根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件,根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作,然后根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本。該方法通過(guò)模擬條件編譯的過(guò)程對(duì)原程序文本進(jìn)行條件編譯預(yù)處理,使得使用解釋型語(yǔ)言開(kāi)發(fā)時(shí)仍然可以使用條件編譯特性,當(dāng)需要適用多種配置時(shí),通過(guò)使用該條件編譯預(yù)處理方法不僅減少了維護(hù)成本,而且減少了資源消耗。
附圖說(shuō)明
圖1為一個(gè)實(shí)施例中終端的內(nèi)部結(jié)構(gòu)框圖;
圖2為一個(gè)實(shí)施例中條件編譯預(yù)處理方法流程圖;
圖3為一個(gè)實(shí)施例中根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作的方法流程圖;
圖4為一個(gè)實(shí)施例中根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本的方法流程圖;
圖5為一個(gè)實(shí)施例中實(shí)現(xiàn)條件編譯預(yù)處理的示意圖;
圖6為一個(gè)實(shí)施例中條件編譯預(yù)處理裝置的結(jié)構(gòu)框圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,在一個(gè)實(shí)施例中,終端102的內(nèi)部結(jié)構(gòu)如圖1所示,包括通過(guò)系統(tǒng)總線連接的處理器、內(nèi)存儲(chǔ)器、非易失性存儲(chǔ)介質(zhì)、網(wǎng)絡(luò)接口、顯示屏和輸入裝置。其中,終端102的非易失性存儲(chǔ)介質(zhì)存儲(chǔ)有操作系統(tǒng),還包括一種條件編譯預(yù)處理裝置,該條件編譯預(yù)處理裝置用于實(shí)現(xiàn)一種條件編譯預(yù)處理方法。該處理器用于提供計(jì)算和控制能力,支撐整個(gè)終端的運(yùn)行。終端中的內(nèi)存儲(chǔ)器為非易失性存儲(chǔ)介質(zhì)中的條件編譯預(yù)處理裝置的運(yùn)行提供環(huán)境,該內(nèi)存儲(chǔ)器中存有計(jì)算機(jī)可讀指令,該計(jì)算機(jī)可讀指令被處理器執(zhí)行時(shí),可使得處理器執(zhí)行一種條件編譯預(yù)處理方法。網(wǎng)絡(luò)接口用于連接到網(wǎng)絡(luò)進(jìn)行通信。終端102的顯示屏可以是液晶顯示屏或者電子墨水顯示屏等,輸入裝置可以是顯示屏上覆蓋的觸摸層,也可以是電子設(shè)備外殼上設(shè)置的按鍵、軌跡球或觸控板,也可以是外接的鍵盤(pán)、觸控板或鼠標(biāo)等。該終端可以是POS機(jī)、平板電腦、筆記本電腦、臺(tái)式計(jì)算機(jī)等。本領(lǐng)域技術(shù)人員可以理解,圖1中示出的結(jié)構(gòu),僅僅是與本申請(qǐng)方案相關(guān)的部分結(jié)構(gòu)的框圖,并不構(gòu)成對(duì)本申請(qǐng)方案所應(yīng)用于其上的終端的限定,具體的移動(dòng)終端可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
如圖2所示,在一個(gè)實(shí)施例中,提出了一種條件編譯預(yù)處理方法,該方法包括:
步驟202,獲取待處理的原程序文本。
在本實(shí)施例中,為了使得解釋型語(yǔ)言(比如,WMLScript)也能夠?qū)崿F(xiàn)條件編譯的特性,通過(guò)模擬C語(yǔ)言進(jìn)行條件編譯的功能,提出一種適用于解釋型語(yǔ)言進(jìn)行條件編譯的預(yù)處理方法。其中,條件編譯的本質(zhì)可以簡(jiǎn)單的理解為:分析原程序文本,根據(jù)“指定條件”保留或刪除某段代碼,并輸出處理后的程序文本,即根據(jù)指定條件從原程序文本中挑選出符合要求的目標(biāo)程序文本。為了對(duì)原程序文本進(jìn)行篩選,終端首先需要獲取待處理的原程序文本,原程序文本是指編寫(xiě)的原程序代碼。
步驟204,對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記。
在本實(shí)施例中,終端獲取到待處理的原程序文本后,為了能夠精確地判斷是否符合“指定條件”。首先,通過(guò)對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配對(duì)應(yīng)的關(guān)鍵字,然后輸出與該匹配到的關(guān)鍵字相應(yīng)的標(biāo)記(token)。其中,預(yù)先設(shè)置了正則表達(dá)式和關(guān)鍵字之間的匹配關(guān)系以及關(guān)鍵字與標(biāo)記之間的對(duì)應(yīng)關(guān)系。具體地,可用采用lex生成的詞法分析器對(duì)原程序文本進(jìn)行分析,其中,lex是詞法掃描代碼生成器,它根據(jù)定義的模式文件生成詞法掃描代碼,模式文件中主要使用正則表達(dá)式來(lái)定義匹配規(guī)則,以及匹配后執(zhí)行的動(dòng)作,比如,執(zhí)行返回標(biāo)記(token)。在另一個(gè)實(shí)施例中,在使用詞法分析器對(duì)原程序文本進(jìn)行分析時(shí)還需要解決以下幾個(gè)問(wèn)題,一是忽略注釋?zhuān)瑢?duì)注釋中的所有文本均需忽略。二是忽略字符串中的任何數(shù)據(jù),即忽略引號(hào)“”包圍的字符串。三是記錄當(dāng)前所在行號(hào),記錄行號(hào)對(duì)后續(xù)處理非常重要,因?yàn)樽罱K進(jìn)行處理依賴(lài)于行號(hào)對(duì)原程序文本進(jìn)行處理的。四是返回與關(guān)鍵字對(duì)應(yīng)的標(biāo)記(token),便于后續(xù)根據(jù)標(biāo)記進(jìn)行語(yǔ)法的匹配。其中,關(guān)鍵字包括#if,#ifdef,#ifndef,#elif,#else,#defined,#endif,#define,#undef等,相應(yīng)的標(biāo)記可以設(shè)置為:IF,IFDEF,IFNDEF,ELIF,ELSE,DEFINED,ENDIF,DEFINE等。五是返回宏名稱(chēng)和宏值,當(dāng)詞法分析器匹配到#define、#undef關(guān)鍵字時(shí),將對(duì)應(yīng)的宏名稱(chēng)及宏值進(jìn)行保存,并返回與宏的名稱(chēng)和宏值對(duì)應(yīng)的標(biāo)記:NAME、MACROVALUE,便于后續(xù)語(yǔ)法分析器根據(jù)匹配到的宏名稱(chēng)和值進(jìn)行宏操作,比如,在宏定義管理器中增加或刪除對(duì)應(yīng)的宏定義。
步驟206,根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件。
在本實(shí)施例中,終端中預(yù)先設(shè)置了條件編譯語(yǔ)法規(guī)則與事件之間的對(duì)應(yīng)關(guān)系,即當(dāng)匹配到相應(yīng)的語(yǔ)法規(guī)則時(shí),輸出對(duì)應(yīng)的事件,便于后續(xù)根據(jù)事件確定相應(yīng)的處理動(dòng)作。具體地,終端可以通過(guò)使用語(yǔ)法分析器根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)事件的。在一個(gè)實(shí)施例中,終端首先啟動(dòng)語(yǔ)法分析器,語(yǔ)法分析器內(nèi)部調(diào)用詞法分析器,利用詞法分析器輸出的標(biāo)記(token)和預(yù)先定義的條件編譯語(yǔ)法規(guī)則,產(chǎn)生相應(yīng)的事件。其中,語(yǔ)法分析器可以采用Yacc來(lái)實(shí)現(xiàn),Yacc是語(yǔ)法分析代碼生成器,它根據(jù)定義的語(yǔ)法文件生成語(yǔ)法分析器。語(yǔ)法文件采用巴科斯范式(Backus-Naur Form)來(lái)描述語(yǔ)法規(guī)則,它使用lex輸出的標(biāo)記(token)以及自身定義的語(yǔ)法規(guī)則來(lái)匹配并執(zhí)行相應(yīng)的動(dòng)作(比如,執(zhí)行一段C代碼)。如表1中所示,展示了事件與對(duì)應(yīng)的條件編譯語(yǔ)法規(guī)則的說(shuō)明。
表1
步驟208,根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作。
在本實(shí)施例中,終端根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件后,獲取當(dāng)前狀態(tài),根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作。在一個(gè)實(shí)施例中,可以預(yù)先存儲(chǔ)處理動(dòng)作與當(dāng)前狀態(tài)和事件的關(guān)系表,當(dāng)獲取到當(dāng)前狀態(tài)和事件后可以確定相應(yīng)的處理動(dòng)作,其中,處理動(dòng)作可以為刪除或保留某段代碼。在另一個(gè)實(shí)施例中,首先需要根據(jù)當(dāng)前狀態(tài)和事件確定下一步的狀態(tài),繼而根據(jù)下一步的狀態(tài)確定對(duì)應(yīng)的處理動(dòng)作。具體地,首先,終端通過(guò)語(yǔ)法分析器匹配到事件后,輸出事件到狀態(tài)處理器中,驅(qū)動(dòng)狀態(tài)處理器中的狀態(tài)進(jìn)行跳轉(zhuǎn),即從一個(gè)狀態(tài)跳轉(zhuǎn)到另一個(gè)狀態(tài)。然后根據(jù)跳轉(zhuǎn)到的另一個(gè)狀態(tài)確定對(duì)應(yīng)的處理動(dòng)作。其中,語(yǔ)法分析器、狀態(tài)處理器等都是終端內(nèi)部的軟件實(shí)現(xiàn)。在一個(gè)實(shí)施例中,根據(jù)條件編譯語(yǔ)法特性,狀態(tài)處理器采用棧的方式來(lái)存儲(chǔ)和管理狀態(tài)(即維護(hù)了一個(gè)狀態(tài)棧)。如表2中所示,展示了預(yù)定義的狀態(tài)以及相應(yīng)的狀態(tài)說(shuō)明。通過(guò)獲取當(dāng)前狀態(tài)和匹配到的事件確定下一步狀態(tài)(參考表3),進(jìn)而確定對(duì)應(yīng)的處理動(dòng)作。
表2
步驟210,根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本。
在本實(shí)施例中,終端當(dāng)確定完處理動(dòng)作后,根據(jù)該確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,并輸出處理后的目標(biāo)程序文本,該輸出的目標(biāo)程序文本就是根據(jù)指定條件篩選出來(lái)的需要用到的目標(biāo)程序代碼,后續(xù)使用編譯器對(duì)該目標(biāo)程序文本進(jìn)行編譯即可實(shí)現(xiàn)對(duì)應(yīng)的條件編譯功能。具體地,終端通過(guò)狀態(tài)處理器根據(jù)下一步狀態(tài)向動(dòng)作處理器的動(dòng)作列表中添加相應(yīng)的處理動(dòng)作,然后動(dòng)作處理器會(huì)根據(jù)動(dòng)作列表中的處理動(dòng)作進(jìn)行對(duì)應(yīng)的處理,比如,刪除相應(yīng)的一行或多行代碼,之后輸出處理后的目標(biāo)程序文本,其中,狀態(tài)處理器、動(dòng)作處理器是終端內(nèi)部的軟件實(shí)現(xiàn),可以理解為功能實(shí)現(xiàn)模塊。
在本實(shí)施例中,通過(guò)對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記,然后根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件,根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作,然后根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本。該方法通過(guò)模擬條件編譯的過(guò)程對(duì)原程序文本進(jìn)行條件編譯預(yù)處理,使得使用解釋型語(yǔ)言開(kāi)發(fā)時(shí)仍然可以使用條件編譯特性,當(dāng)需要適用多種配置時(shí),通過(guò)使用該條件編譯預(yù)處理方法不僅減少了維護(hù)成本,而且減少了資源消耗。
如圖3所示,在一個(gè)實(shí)施例中,根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作的步驟包括:
步驟208A,根據(jù)當(dāng)前狀態(tài)和事件確定下一步狀態(tài)。
在本實(shí)施例中,當(dāng)根據(jù)預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配到相應(yīng)的事件后,獲取當(dāng)前狀態(tài),通過(guò)查詢(xún)狀態(tài)表查找與當(dāng)前狀態(tài)和事件對(duì)應(yīng)的下一步狀態(tài)。如表3中所示,為一個(gè)實(shí)施例中的狀態(tài)表。表3中縱軸第1列代表的是當(dāng)前狀態(tài),橫軸第1行為事件,其他單元格表示當(dāng)前狀態(tài)接收到事件時(shí)的下一步狀態(tài)。比如,當(dāng)前狀態(tài)為初始態(tài),即STATE_INITIAL,而發(fā)生的事件為EVENT_IF_TRUE,通過(guò)查詢(xún)狀態(tài)表,即表3,可以得到對(duì)應(yīng)的下一步狀態(tài)為STATE_IF_TRUE(即第3行第2列對(duì)應(yīng)的單元格)。
表3
步驟208B,根據(jù)下一步狀態(tài)確定相應(yīng)的處理動(dòng)作。
在本實(shí)施例中,當(dāng)確定了下一步狀態(tài)后,根據(jù)該下一步狀態(tài)確定相應(yīng)的處理動(dòng)作。具體地,根據(jù)下一步的狀態(tài),可以區(qū)分出下一步采取的動(dòng)作。預(yù)先定義動(dòng)作的類(lèi)型,比如,動(dòng)作分為兩類(lèi),一種是刪除當(dāng)前行(比如,if,else,elif自己所在行),對(duì)應(yīng)的下一步狀態(tài)為:STATE_IF_TRUE,STATE_ELSE_TRUE,STATE_ELIF_TRUE,STATE_ENDIF;一種是刪除多行,對(duì)應(yīng)的下一步狀態(tài)為:STATE_IF_FALSE,STATE_IF_INHERIT_FALSE,STATE_ELSE_FALSE,STATE_ELIF_FALSE。
如圖4所示,在一個(gè)實(shí)施例中,根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本的步驟包括:
步驟210A,將確定的處理動(dòng)作添加到動(dòng)作列表。
在本實(shí)施例中,根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作后,將確定的動(dòng)作添加到動(dòng)作列表。具體地,終端首先通過(guò)語(yǔ)法分析器匹配到事件,然后由該事件驅(qū)動(dòng)狀態(tài)處理器的跳轉(zhuǎn),之后狀態(tài)處理器通過(guò)查詢(xún)狀態(tài)表根據(jù)當(dāng)前狀態(tài)和事件確定下一步狀態(tài),然后根據(jù)下一步狀態(tài)確定對(duì)應(yīng)的處理動(dòng)作,進(jìn)而將確定的動(dòng)作添加到動(dòng)作處理器的動(dòng)作列表,便于后續(xù)動(dòng)作處理器根據(jù)動(dòng)作列表中的動(dòng)作進(jìn)行相應(yīng)的處理,其中,語(yǔ)法分析器、狀態(tài)處理器、動(dòng)作處理器等都是終端內(nèi)部的軟件實(shí)現(xiàn)。
步驟210B,根據(jù)動(dòng)作列表對(duì)原程序文本執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
在本實(shí)施例中,終端通過(guò)狀態(tài)處理器將處理動(dòng)作添加到動(dòng)作處理器的動(dòng)作列表后,根據(jù)動(dòng)作列表對(duì)原程序文件進(jìn)行處理的方式有兩種,一種是,將所有的處理動(dòng)作都添加到動(dòng)作列表后,動(dòng)作處理器根據(jù)保存的一系列處理動(dòng)作對(duì)原程序文本執(zhí)行對(duì)應(yīng)的操作;一種是,每當(dāng)有動(dòng)作添加到動(dòng)作列表,動(dòng)作處理器便開(kāi)始執(zhí)行對(duì)應(yīng)的處理動(dòng)作,然后輸出處理后的程序文本,即目標(biāo)程序文本。舉個(gè)例子,根據(jù)典型的條件編譯處理#if true…#else…#endif,最終采取的處理動(dòng)作為1)刪除#if true這一行本身;2)刪除#else(含)到endif(含)之間的所有行??紤]到待刪除的代碼本身對(duì)程序員有參考價(jià)值,動(dòng)作處理器并不真正刪除代碼行,而是在這些代碼前加上行注釋“//”。終端完成處理動(dòng)作后,輸出處理后的目標(biāo)程序文本,如果后面還有編譯過(guò)程,則輸出到編譯器進(jìn)行處理,從而實(shí)現(xiàn)了條件編譯。
在一個(gè)實(shí)施例中,根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件的步驟包括:根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則進(jìn)行匹配,當(dāng)匹配到包含宏名稱(chēng)的條件語(yǔ)句時(shí),向宏定義管理器查詢(xún)與宏名稱(chēng)對(duì)應(yīng)的定義及相應(yīng)的值以進(jìn)行條件判斷,根據(jù)條件判斷的結(jié)果匹配出相應(yīng)的事件。
在本實(shí)施例中,宏定義管理器用于管理宏定義,條件編譯的條件判斷有時(shí)需要基于宏定義的內(nèi)容。當(dāng)匹配到包含宏名稱(chēng)的條件語(yǔ)句時(shí),需要向宏定義管理器中查詢(xún)與匹配到的宏名稱(chēng)對(duì)應(yīng)的宏值,便于根據(jù)該宏值進(jìn)行條件判斷,即判斷該條件是TRUE還是FALSE。其中,宏定義包含兩大類(lèi),一種是通過(guò)命令行參數(shù)傳入的全局宏定義-D,一種是文件局部使用#define定義的宏。局部定義的宏會(huì)覆蓋全局定義,而且只會(huì)影響本文件該行后面的行為,對(duì)其他文件不產(chǎn)生作用。另外,宏記錄的信息除了包括宏類(lèi)型,即全局宏和局部宏外,還記錄了宏的狀態(tài)、宏名稱(chēng)、宏值以及宏行號(hào)。宏?duì)顟B(tài)包括可用的、暫時(shí)失效的、無(wú)效的。其中,暫時(shí)失效狀態(tài)適用于全局宏,表示使用-D定義過(guò)但是在某個(gè)文件中被取消(#undef)了,這個(gè)狀態(tài)只影響該文件本身,處理另一個(gè)文件時(shí),-D仍然恢復(fù)為可用狀態(tài);無(wú)效狀態(tài)適用于局部宏,表示在某個(gè)文件中被取消(#undef)了。宏定義管理器中的宏行號(hào)僅對(duì)局部宏有效,它主要用于當(dāng)檢測(cè)到同一文件中出現(xiàn)兩次相同的宏定義時(shí),給出警告,提示當(dāng)前的定義在哪一行,在做查詢(xún)操作時(shí),先檢測(cè)局部宏,如果不存在,在檢查全局宏。在一個(gè)實(shí)施例中,當(dāng)碰到以下語(yǔ)句#ifdef NAME,#ifndef NAME,#if NAME,#elif NAME,#if defined(NAME)時(shí),需要查詢(xún)宏定義管理器,看是否定義以及對(duì)應(yīng)的值是什么,如果查找不到,則返回NULL表示找不到定義。
在一個(gè)實(shí)施例中,當(dāng)匹配到包含宏名稱(chēng)的定義語(yǔ)句時(shí),根據(jù)定義語(yǔ)句的類(lèi)型在宏定義管理器中增加或刪除相應(yīng)的宏定義。
在本實(shí)施例中,由于有時(shí)進(jìn)行條件判斷需要基于宏定義管理器中的宏定義,所以首先需要在宏定義管理器中添加宏定義,添加后如果在后面發(fā)現(xiàn)被取消了,還需要在宏定義管理器中刪除相應(yīng)的宏定義。具體地,首先是終端通過(guò)詞法分析器根據(jù)預(yù)設(shè)的正則表達(dá)式進(jìn)行匹配,并輸出相應(yīng)的標(biāo)記,其中,標(biāo)記中包含了代表宏名稱(chēng)的標(biāo)記。比如,當(dāng)匹配到關(guān)鍵字#define NAME VALUE、#defineNAME或#undef NAME時(shí),返回宏的名稱(chēng)。也就是說(shuō),當(dāng)匹配到define,undef關(guān)鍵字時(shí),將對(duì)應(yīng)的文本存儲(chǔ)(將真實(shí)的宏名稱(chēng)存儲(chǔ)),并返回標(biāo)記NAME。然后通過(guò)語(yǔ)法分析器根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則進(jìn)行匹配,當(dāng)匹配到包含宏名稱(chēng)的定義語(yǔ)句時(shí),則根據(jù)該定義語(yǔ)句的類(lèi)型在宏定義管理器中增加或刪除相應(yīng)的宏定義。其中,宏定義語(yǔ)句是指包含#define,#undef等定義性詞語(yǔ)的語(yǔ)句。根據(jù)定義語(yǔ)句的類(lèi)型,將語(yǔ)句分為定義和取消定義兩種,其中,包含#define的語(yǔ)句表示定義類(lèi)型的語(yǔ)句,包含#undef的語(yǔ)句表示取消定義類(lèi)型的語(yǔ)句。在一個(gè)實(shí)施例中,當(dāng)碰到以下語(yǔ)句時(shí)對(duì)宏定義管理器進(jìn)行添加操作#define NAME,#define NAME VALUE,當(dāng)碰到#undef NAME時(shí)會(huì)對(duì)宏定義管理器進(jìn)行刪除操作。通過(guò)在宏定義管理器中添加或刪除宏定義,便于后續(xù)當(dāng)匹配到含有宏名稱(chēng)的條件語(yǔ)句時(shí),通過(guò)查詢(xún)相應(yīng)的宏定義來(lái)進(jìn)行條件判斷,即判斷是TRUE還是FALSE。
在一個(gè)實(shí)施例中,對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記的步驟204包括:對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字,記錄關(guān)鍵字所在的行號(hào),輸出相應(yīng)的標(biāo)記和對(duì)應(yīng)的行號(hào)。
在本實(shí)施例中,為了便于執(zhí)行確定的處理動(dòng)作,在對(duì)原程序文本進(jìn)行分析,匹配出對(duì)應(yīng)的關(guān)鍵字后,不僅需要輸出與關(guān)鍵字對(duì)應(yīng)的標(biāo)記(token),而且需要記錄每個(gè)匹配到的關(guān)鍵字所在的行號(hào)并輸出。記錄行號(hào)對(duì)后續(xù)的處理非常重要,因?yàn)閯?dòng)作處理器最終是依賴(lài)行號(hào)對(duì)程序文本進(jìn)行處理的。具體實(shí)現(xiàn)的手段可以通過(guò)定義一個(gè)用于增加行號(hào)的c函數(shù),然后由詞法分析器通過(guò)調(diào)用這個(gè)函數(shù)來(lái)增加全局行號(hào)。比如,每當(dāng)碰到“\n”時(shí),調(diào)用c函數(shù)增加全局行號(hào)。
在一個(gè)實(shí)施例中,根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本的步驟210包括:根據(jù)處理動(dòng)作的類(lèi)型和對(duì)應(yīng)的行號(hào)執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
在本實(shí)施例中,終端通過(guò)狀態(tài)處理器將對(duì)應(yīng)的處理動(dòng)作添加到動(dòng)作處理器的動(dòng)作列表后,使動(dòng)作處理器根據(jù)處理動(dòng)作的類(lèi)型和對(duì)應(yīng)的行號(hào)執(zhí)行對(duì)應(yīng)的處理動(dòng)作,然后輸出處理后的目標(biāo)程序文本。處理動(dòng)作的類(lèi)型可以分為兩類(lèi):一種是刪除當(dāng)前行;一種是刪除多行。在進(jìn)行動(dòng)作處理時(shí),每個(gè)處理動(dòng)作都對(duì)應(yīng)一個(gè)起始行號(hào)和結(jié)束行號(hào)信息。第I類(lèi)動(dòng)作可以當(dāng)成起始行號(hào)和結(jié)束行號(hào)相同的特例。對(duì)于第II類(lèi)動(dòng)作,由于在匹配到刪除多行的事件時(shí),還不知道結(jié)束行號(hào)是多少,可以暫時(shí)將結(jié)束行號(hào)與起始行號(hào)寫(xiě)成相同的值,當(dāng)下一個(gè)事件產(chǎn)生新的動(dòng)作后,在添加新動(dòng)作之前,將之前的結(jié)束行號(hào)更新為當(dāng)前行號(hào)-1即可。具體地,處理動(dòng)作是與狀態(tài)處理器確定的下一步狀態(tài)對(duì)應(yīng)的,當(dāng)下一步狀態(tài)為:STATE_IF_TRUE,STATE_ELSE_TRUE,STATE_ELIF_TRUE,STATE_ENDIF時(shí),則對(duì)應(yīng)的動(dòng)作為:刪除當(dāng)前行。當(dāng)下一步狀態(tài)為:STATE_IF_FALSE,STATE_IF_INHERIT_FALSE,STATE_ELSE_FALSE,STATE_ELIF_FALSE時(shí),對(duì)應(yīng)的動(dòng)作為:刪除多行。舉例說(shuō)明,當(dāng)確定的下一步狀態(tài)為STATE_IF_TRUE時(shí),那么只需要?jiǎng)h除當(dāng)前行,即起始行號(hào)和結(jié)束行號(hào)相同。當(dāng)確定的下一步狀態(tài)為:STATE_IF_FALSE時(shí),說(shuō)明需要?jiǎng)h除多行,但是具體刪除幾行還不知道,即還不知道結(jié)束行號(hào)是多少,當(dāng)出現(xiàn)下一個(gè)事件時(shí),假設(shè)出現(xiàn)的新事件為EVENT_ELSE_TRUE,那么其對(duì)應(yīng)的下一個(gè)狀態(tài)為STATE_ELSE_TRUE,表示刪除當(dāng)前行,在刪除當(dāng)前行之前,將當(dāng)前行號(hào)減去1,作為上一事件的結(jié)束行號(hào)。
如圖5所示,在一個(gè)實(shí)施例中,實(shí)現(xiàn)上述條件編譯的方法具體是通過(guò)詞法分析器、語(yǔ)法分析器、狀態(tài)處理器、動(dòng)作處理器以及宏定義管理器相互配合來(lái)完成的。首先,如果命令行參數(shù)中有-D,主程序會(huì)將全局宏添加到宏定義管理器中,接下來(lái),終端中的主程序?qū)γ總€(gè)原程序文本,循環(huán)執(zhí)行如下操作,a),主程序啟用語(yǔ)法分析器,語(yǔ)法分析器內(nèi)部調(diào)用詞法分析器,通過(guò)詞法分析器對(duì)原程序文本進(jìn)行分析匹配出相應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記(token),然后語(yǔ)法分析器利用詞法分析器輸出的標(biāo)記(token)及事先定義的語(yǔ)法規(guī)則,產(chǎn)生相應(yīng)的事件,在此過(guò)程中,根據(jù)匹配到的包含宏名稱(chēng)的語(yǔ)句對(duì)宏定義管理器進(jìn)行相應(yīng)的增、刪、查的操作;b)語(yǔ)法分析器輸出事件到狀態(tài)處理器,驅(qū)動(dòng)狀態(tài)機(jī)的跳轉(zhuǎn),狀態(tài)處理器根據(jù)下一步狀態(tài)確定相應(yīng)的處理動(dòng)作,并將處理動(dòng)作添加到動(dòng)作處理器中。c)主程序按順序執(zhí)行處理器中的動(dòng)作列表,輸出處理后的程序文本,即目標(biāo)程序文本。上述詞法分析器、語(yǔ)法分析器、狀態(tài)處理器、動(dòng)作處理器以及宏定義管理器通過(guò)相互配合實(shí)現(xiàn)了對(duì)條件編譯的預(yù)處理,實(shí)現(xiàn)該條件編譯的預(yù)處理方法所對(duì)應(yīng)的條件編譯預(yù)處理器的執(zhí)行文件僅36k左右,是一種輕量級(jí)的條件編譯預(yù)處理器,且如果有后續(xù)編譯過(guò)程,只需在標(biāo)準(zhǔn)編譯流程前添加條件編譯預(yù)處理器命令即可,方便集成。此外,該方法適用于多種語(yǔ)言,比如,WMLScript,JavaScript,Java、Python等,由于不同程序語(yǔ)言有不同的規(guī)范,可根據(jù)需要微調(diào)詞法、語(yǔ)法規(guī)則文件就可以快速適應(yīng)任何語(yǔ)言。因此,還具有通用性,易擴(kuò)展的特點(diǎn)。
如圖6所示,在一個(gè)實(shí)施例中,提出了一種條件編譯預(yù)處理裝置,該裝置包括:
獲取模塊602,用于獲取待處理的原程序文本。
輸出模塊604,用于對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字并輸出相應(yīng)的標(biāo)記。
匹配模塊606,用于根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則匹配出相應(yīng)的事件。
確定模塊608,用于根據(jù)當(dāng)前狀態(tài)和事件確定相應(yīng)的處理動(dòng)作。
處理模塊610,用于根據(jù)確定的處理動(dòng)作對(duì)原程序文本進(jìn)行對(duì)應(yīng)的處理,輸出處理后的目標(biāo)程序文本。
在一個(gè)實(shí)施例中,確定模塊還用于根據(jù)當(dāng)前狀態(tài)和事件確定下一步狀態(tài),根據(jù)下一步狀態(tài)確定相應(yīng)的處理動(dòng)作。
在一個(gè)實(shí)施例中,處理模塊還用于將確定的處理動(dòng)作添加到動(dòng)作列表,根據(jù)動(dòng)作列表對(duì)原程序文本執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
在一個(gè)實(shí)施例中,匹配模塊還用于根據(jù)標(biāo)記和預(yù)設(shè)的條件編譯語(yǔ)法規(guī)則進(jìn)行匹配,當(dāng)匹配到包含宏名稱(chēng)的條件語(yǔ)句時(shí),向宏定義管理器查詢(xún)與宏名稱(chēng)對(duì)應(yīng)的定義及相應(yīng)的值以進(jìn)行條件判斷,根據(jù)條件判斷的結(jié)果匹配出相應(yīng)的事件。
在一個(gè)實(shí)施例中,輸出模塊還用于對(duì)原程序文本進(jìn)行分析,根據(jù)預(yù)設(shè)的正則表達(dá)式匹配出對(duì)應(yīng)的關(guān)鍵字,記錄關(guān)鍵字所在的行號(hào),輸出相應(yīng)的標(biāo)記和對(duì)應(yīng)的行號(hào)。處理模塊還用于根據(jù)處理動(dòng)作的類(lèi)型和對(duì)應(yīng)的行號(hào)執(zhí)行對(duì)應(yīng)的處理動(dòng)作,輸出處理后的目標(biāo)程序文本。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過(guò)計(jì)算機(jī)程序來(lái)指令相關(guān)的硬件來(lái)完成,該計(jì)算機(jī)程序可存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,前述的存儲(chǔ)介質(zhì)可為磁碟、光盤(pán)、只讀存儲(chǔ)記憶體(Read-Only Memory,ROM)等非易失性存儲(chǔ)介質(zhì),或隨機(jī)存儲(chǔ)記憶體(Random Access Memory,RAM)等。
以上所述實(shí)施例的各技術(shù)特征可以進(jìn)行任意的組合,為使描述簡(jiǎn)潔,未對(duì)上述實(shí)施例中的各個(gè)技術(shù)特征所有可能的組合都進(jìn)行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說(shuō)明書(shū)記載的范圍。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)發(fā)明專(zhuān)利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專(zhuān)利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。