本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種代碼轉(zhuǎn)換方法及裝置。
背景技術(shù):
當(dāng)前,計(jì)算機(jī)領(lǐng)域中存在各種各樣的計(jì)算機(jī)語言的平臺(tái),例如JS(JavaScript,直譯式腳本語言)語言的平臺(tái)、PHP(Professional Hypertext Preprocessor,專業(yè)超文本預(yù)處理)語言的平臺(tái)和C#(面向?qū)ο缶幊陶Z言)語言的平臺(tái)等,每種計(jì)算機(jī)語言的平臺(tái)都具有各自的計(jì)算機(jī)語言編碼格式,且各個(gè)計(jì)算機(jī)語言的平臺(tái)對(duì)應(yīng)的計(jì)算機(jī)語言編碼格式不同。
對(duì)于任一種計(jì)算機(jī)語言的平臺(tái),在該計(jì)算機(jī)語言的平臺(tái)上只能應(yīng)用由該計(jì)算機(jī)語言的平臺(tái)對(duì)應(yīng)的計(jì)算機(jī)語言編碼格式編寫的代碼。例如,JS語言的平臺(tái)上只能應(yīng)用由JS語言的平臺(tái)對(duì)應(yīng)的JS語言編碼格式編寫的代碼,PHP語言的平臺(tái)上只能應(yīng)用由PHP語言的平臺(tái)對(duì)應(yīng)的PHP語言編碼格式編寫的代碼。
其中,當(dāng)技術(shù)人員根據(jù)一個(gè)計(jì)算機(jī)語言編碼格式編寫了一段具有某一功能的代碼時(shí),就可以在該一個(gè)計(jì)算機(jī)語言編碼格式對(duì)應(yīng)的計(jì)算機(jī)語言的平臺(tái)上應(yīng)用該一段代碼,如果技術(shù)人員需要在另一個(gè)計(jì)算機(jī)語言編碼格式對(duì)應(yīng)的計(jì)算機(jī)語言的平臺(tái)上應(yīng)用具有該功能的代碼時(shí),必須根據(jù)該另一個(gè)計(jì)算機(jī)語言編碼格式編寫一段具有該功能的代碼,但是這樣會(huì)增加技術(shù)人員的工作量,導(dǎo)致人工成本較高。
技術(shù)實(shí)現(xiàn)要素:
為克服相關(guān)技術(shù)中存在的問題,本發(fā)明提供一種代碼轉(zhuǎn)換方法及裝置。
根據(jù)本發(fā)明實(shí)施例的第一方面,提供一種代碼轉(zhuǎn)換方法,所述方法包括:
接收用戶輸入的對(duì)源編碼格式的源代碼進(jìn)行格式轉(zhuǎn)換的請(qǐng)求;所述請(qǐng)求中攜帶有所述源代碼和目標(biāo)編碼格式的標(biāo)識(shí),所述目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式與所述源編碼格式不同;
根據(jù)所述源編碼格式對(duì)所述源代碼進(jìn)行分析,得到所述源代碼中包含的數(shù)據(jù)字符串和所述源編碼格式的語法字符串;
將所述源編碼格式的語法字符串轉(zhuǎn)換為目標(biāo)編碼格式對(duì)應(yīng)的語法字符串;所述目標(biāo) 編碼格式為目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式;
將所述數(shù)據(jù)字符串和所述目標(biāo)編碼格式對(duì)應(yīng)的語法字符串結(jié)合生成目標(biāo)編碼格式的目標(biāo)代碼。
其中,所述根據(jù)所述源編碼格式對(duì)所述源代碼進(jìn)行分析,得到所述源代碼中包含的數(shù)據(jù)字符串和所述源編碼格式的語法字符串,包括:
對(duì)所述源代碼進(jìn)行正則匹配;
在所述源代碼中獲取所述源編碼格式對(duì)應(yīng)的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串;獲取的第一預(yù)設(shè)字符串的個(gè)數(shù)與獲取的第二預(yù)設(shè)字符串的個(gè)數(shù)相同;
將獲取到的第一預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序,以及將獲取到的第二預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序;
將次序相同第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串組成預(yù)設(shè)字符串組;
對(duì)于每一個(gè)預(yù)設(shè)字符串組,將所述預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串、第二預(yù)設(shè)字符串以及位于所述預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串之間的字符串分別確定為所述源編碼格式的語法字符串;
將所述源代碼中的除確定出的源編碼格式的語法字符串之外的字符串確定為數(shù)據(jù)字符串。
其中,所述根據(jù)所述源編碼格式對(duì)所述源代碼進(jìn)行分析,得到所述源代碼中包含的數(shù)據(jù)字符串和所述源編碼格式的語法字符串,包括:
構(gòu)建所述源代碼對(duì)應(yīng)的抽象語法樹;
從所述抽象語法樹中獲取所述源代碼中的數(shù)據(jù)字符串和所述源編碼格式的語法字符串。
其中,所述構(gòu)建所述源代碼對(duì)應(yīng)的抽象語法樹,包括:
獲取預(yù)設(shè)分析法;
根據(jù)所述預(yù)設(shè)分析法創(chuàng)建狀態(tài)機(jī);
將所述源代碼中的所有字符串依次輸入狀態(tài)機(jī);
檢測(cè)是否將所述源代碼中的所有字符串全部輸入至所述狀態(tài)機(jī);
當(dāng)將所述源代碼中的所有字符串全部輸入至所述狀態(tài)機(jī)時(shí),根據(jù)所述狀態(tài)機(jī)輸出的字符串生成所述源代碼對(duì)應(yīng)的抽象語法樹。
其中,所述將所述源編碼格式的語法字符串轉(zhuǎn)換為目標(biāo)編碼格式對(duì)應(yīng)的語法字符串,包括:
獲取預(yù)先設(shè)置的源編碼格式的語法字符串與目標(biāo)編碼格式的語法字符串之間的對(duì) 應(yīng)關(guān)系;
在所述對(duì)應(yīng)關(guān)系中獲取每個(gè)所述源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串;
對(duì)于獲取的每一個(gè)目標(biāo)編碼格式的語法字符串,在所述抽象語法樹中,利用所述目標(biāo)編碼格式的語法字符串替換與所述目標(biāo)編碼格式的語法字符串對(duì)應(yīng)的源編碼格式的語法字符串。
根據(jù)本發(fā)明實(shí)施例的第二方面,提供一種代碼轉(zhuǎn)換裝置,所述裝置包括:
接收模塊,用于接收用戶輸入的對(duì)源編碼格式的源代碼進(jìn)行格式轉(zhuǎn)換的請(qǐng)求;所述請(qǐng)求中攜帶有所述源代碼和目標(biāo)編碼格式的標(biāo)識(shí),所述目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式與所述源編碼格式不同;
分析模塊,用于根據(jù)所述源編碼格式對(duì)所述源代碼進(jìn)行分析,得到所述源代碼中包含的數(shù)據(jù)字符串和所述源編碼格式的語法字符串;
轉(zhuǎn)換模塊,用于將所述源編碼格式的語法字符串轉(zhuǎn)換為目標(biāo)編碼格式對(duì)應(yīng)的語法字符串;所述目標(biāo)編碼格式為目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式;
結(jié)合模塊,用于將所述數(shù)據(jù)字符串和所述目標(biāo)編碼格式對(duì)應(yīng)的語法字符串結(jié)合生成目標(biāo)編碼格式的目標(biāo)代碼。
其中,所述分析模塊包括:
正則匹配單元,用于對(duì)所述源代碼進(jìn)行正則匹配;
第一獲取單元,用于在所述源代碼中獲取所述源編碼格式對(duì)應(yīng)的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串;獲取的第一預(yù)設(shè)字符串的個(gè)數(shù)與獲取的第二預(yù)設(shè)字符串的個(gè)數(shù)相同;
排序單元,用于將獲取到的第一預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序,以及將獲取到的第二預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序;
組成單元,用于將次序相同第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串組成預(yù)設(shè)字符串組;
第一確定單元,用于對(duì)于每一個(gè)預(yù)設(shè)字符串組,將所述預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串、第二預(yù)設(shè)字符串以及位于所述預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串之間的字符串分別確定為所述源編碼格式的語法字符串;
第二確定單元,用于將所述源代碼中的除確定出的源編碼格式的語法字符串之外的字符串確定為數(shù)據(jù)字符串。
其中,所述分析模塊包括:
構(gòu)建單元,用于構(gòu)建所述源代碼對(duì)應(yīng)的抽象語法樹;
第二獲取單元,用于從所述抽象語法樹中獲取所述源代碼中的數(shù)據(jù)字符串和所述源 編碼格式的語法字符串。
其中,所述構(gòu)建單元包括:
獲取子單元,用于獲取預(yù)設(shè)分析法;
創(chuàng)建子單元,用于根據(jù)所述預(yù)設(shè)分析法創(chuàng)建狀態(tài)機(jī);
輸入子單元,用于將所述源代碼中的所有字符串依次輸入狀態(tài)機(jī);
檢測(cè)子單元,用于檢測(cè)是否將所述源代碼中的所有字符串全部輸入至所述狀態(tài)機(jī);
生成子單元,用于當(dāng)將所述源代碼中的所有字符串全部輸入至所述狀態(tài)機(jī)時(shí),根據(jù)所述狀態(tài)機(jī)輸出的字符串生成所述源代碼對(duì)應(yīng)的抽象語法樹。
其中,所述轉(zhuǎn)換模塊包括:
第三獲取單元,用于獲取預(yù)先設(shè)置的源編碼格式的語法字符串與目標(biāo)編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系;
第四獲取單元,用于在所述對(duì)應(yīng)關(guān)系中獲取每個(gè)所述源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串;
替換單元,用于對(duì)于獲取的每一個(gè)目標(biāo)編碼格式的語法字符串,在所述抽象語法樹中,利用所述目標(biāo)編碼格式的語法字符串替換與所述目標(biāo)編碼格式的語法字符串對(duì)應(yīng)的源編碼格式的語法字符串。
本發(fā)明的實(shí)施例提供的技術(shù)方案可以包括以下有益效果:通過本發(fā)明的方法,當(dāng)技術(shù)人員事先根據(jù)源編碼格式編寫了一段具有某一功能的源代碼時(shí),如果要在某一語言的平臺(tái)上應(yīng)用具有該功能的代碼,該語言支持的編碼格式與源編碼格式不同,只需將源代碼的源編碼格式轉(zhuǎn)化為該語言支持的編碼格式,這樣就可以將轉(zhuǎn)換后的代碼應(yīng)用至該語言的平臺(tái)上,無需使得技術(shù)人員再根據(jù)該語言的平臺(tái)支持的編碼格式編寫一段具有該功能的代碼,從而可以降低人工成本。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本發(fā)明。
附圖說明
此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實(shí)施例,并與說明書一起用于解釋本發(fā)明的原理。
圖1是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換方法的流程圖。
圖2是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換方法的流程圖。
圖3是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換方法的流程圖。
圖4是根據(jù)一示例性實(shí)施例示出的一種抽象語法樹的示意圖。
圖5是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換方法的流程圖。
圖6是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換裝置的框圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本發(fā)明相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
圖1是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換方法的流程圖,如圖1所示,該方法包括以下步驟。
在步驟S101中,接收用戶輸入的對(duì)源編碼格式的源代碼進(jìn)行格式轉(zhuǎn)換的請(qǐng)求;
該請(qǐng)求中攜帶有源代碼和目標(biāo)編碼格式的標(biāo)識(shí);目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式與所述源編碼格式不同;
目標(biāo)編碼格式的標(biāo)識(shí)為目標(biāo)編碼格式的名稱或編號(hào)等,本發(fā)明對(duì)此不加以限定。
其中,目標(biāo)編碼格式可以為JS語言支持的編碼格式,PHP語言支持的編碼格式,velocity語言支持的編碼格式,或者asp語言支持的編碼格式等。
源編碼格式為預(yù)先設(shè)置的DSL(domain specific language,領(lǐng)域特定語言)語言支持的編碼格式。
例如,在預(yù)先設(shè)置的DSL語言支持的編碼格式可以為:變量定義語法字符串“set”,輸出字面量語法字符串“$+變量名”,判斷流程控制語法字符串“if”、“elseif”和“else”,循環(huán)流程控制語法字符串“each val,index in items”、“$val”和“/each”。嵌套語法字符串“include'foo.tpl',data”,中斷定義語法字符串“stop”,注釋定義語法字符串“comment”,第一預(yù)設(shè)標(biāo)識(shí)符以及第二預(yù)設(shè)標(biāo)識(shí)符等。第一預(yù)設(shè)標(biāo)識(shí)符以及第二預(yù)設(shè)標(biāo)識(shí)符可以將語法字符串與其他字符串進(jìn)行區(qū)分。例如,第一預(yù)設(shè)標(biāo)識(shí)符緊挨在一個(gè)語法字符串之前且第二預(yù)設(shè)標(biāo)識(shí)符緊挨在該一個(gè)語法字符串之后,這樣,第一預(yù)設(shè)標(biāo)識(shí)符和第二預(yù)設(shè)標(biāo)識(shí)符就可以將該一個(gè)語法字符串與其他字符串進(jìn)行區(qū)分。
例如,第一預(yù)設(shè)標(biāo)識(shí)符可以為“<#”,以及第二標(biāo)預(yù)設(shè)識(shí)符可以為“#>”;或者,第一預(yù)設(shè)標(biāo)識(shí)符也可以為“<%”,以及第二預(yù)設(shè)標(biāo)識(shí)符也可以為“%>”,本發(fā)明對(duì)比不加以限定。
其中,在本發(fā)明實(shí)施例中,以第一預(yù)設(shè)標(biāo)識(shí)符為“<#”以及第二標(biāo)識(shí)符為“#>”進(jìn) 行舉例說明,但不作為對(duì)本發(fā)明保護(hù)范圍的限制。
例如,假設(shè)獲取用戶輸入的該請(qǐng)求中的源編碼格式的源代碼為:
“<h1><#$header#></h1>
<#each val,index in$items#>
<#if$val.first#>”,以及用戶輸入的該請(qǐng)求中的目標(biāo)編碼格式的標(biāo)識(shí)為PHP語言支持的編碼格式的標(biāo)識(shí)。
在步驟S102中,根據(jù)源編碼格式對(duì)源代碼進(jìn)行分析,得到源代碼中包含的數(shù)據(jù)字符串和源編碼格式的語法字符串;
其中,在上述源代碼中,“<#”為第一預(yù)設(shè)字符串,“#>”為第二預(yù)設(shè)字符串,第一預(yù)設(shè)字符串、第二預(yù)設(shè)字符串和位于第一預(yù)設(shè)字符串與第二預(yù)設(shè)字符串之間的字符串為語法字符串;除語法字符串以外的其他字符串為數(shù)據(jù)字符串。
在步驟S103中,將源編碼格式的語法字符串轉(zhuǎn)換為目標(biāo)編碼格式對(duì)應(yīng)的語法字符串;
其中,目標(biāo)編碼格式為目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式。
在步驟S104中,將數(shù)據(jù)字符串和目標(biāo)編碼格式對(duì)應(yīng)的語法字符串結(jié)合生成目標(biāo)編碼格式的目標(biāo)代碼。
通過本發(fā)明圖1所示的實(shí)施例的方法,當(dāng)技術(shù)人員事先根據(jù)源編碼格式編寫了一段具有某一功能的源代碼時(shí),如果要在某一語言的平臺(tái)上應(yīng)用具有該功能的代碼,該語言支持的編碼格式與源編碼格式不同,只需將源代碼的源編碼格式轉(zhuǎn)化為該語言支持的編碼格式,這樣就可以將轉(zhuǎn)換后的代碼應(yīng)用至該語言的平臺(tái)上,無需使得技術(shù)人員再根據(jù)該語言的平臺(tái)支持的編碼格式編寫一段具有該功能的代碼,從而可以降低人工成本。
在本發(fā)明另一實(shí)施例中,參見圖2,步驟S102包括:
在步驟S201中,對(duì)源代碼進(jìn)行正則匹配;
例如,對(duì)源代碼“<h1><#$header#></h1>
<#each val,index in$items#>
<#if$val.first#>”進(jìn)行正則匹配。
在步驟S202中,在源代碼中獲取源編碼格式對(duì)應(yīng)的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串;
其中,獲取的第一預(yù)設(shè)字符串的個(gè)數(shù)與獲取的第二預(yù)設(shè)字符串的個(gè)數(shù)相同;第一預(yù) 設(shè)字符串為“<#”,第二預(yù)設(shè)字符串為“#>”。
例如,首先獲取“<#$header#>”中的第一預(yù)設(shè)字符串“<#”,以及第二預(yù)設(shè)字符串“#>”,然后獲取“<#each val,index in$items#>”中的第一預(yù)設(shè)字符串“<#”,以及第二預(yù)設(shè)字符串“#>”,最后獲取“<#if$val.first#>”中的第一預(yù)設(shè)字符串“<#”,以及第二預(yù)設(shè)字符串“#>”。
在步驟S203中,將獲取到的第一預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序,以及將獲取到的第二預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序;
其中,獲取的“<#$header#>”中的第一預(yù)設(shè)字符串“<#”和第二預(yù)設(shè)字符串“#>”分別為排序第一的第一預(yù)設(shè)字符串和排序第一的第二預(yù)設(shè)字符串。
獲取的“<#each val,index in$items#>”中的第一預(yù)設(shè)字符串“<#”和第二預(yù)設(shè)字符串“#>”分別為排序第二的第一預(yù)設(shè)字符串和排序第二的第二預(yù)設(shè)字符串。
獲取的“<#if$val.first#>”中的第一預(yù)設(shè)字符串“<#”和第二預(yù)設(shè)字符串“#>”分別為排序第三的第一預(yù)設(shè)字符串和排序第三的第二預(yù)設(shè)字符串。
在步驟S204中,將次序相同第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串組成預(yù)設(shè)字符串組;
其中,將排序第一的第一預(yù)設(shè)字符串和排序第一的第二預(yù)設(shè)字符串組成第一預(yù)設(shè)字符串組;將排序第二的第一預(yù)設(shè)字符串和排序第二的第二預(yù)設(shè)字符串組成第二預(yù)設(shè)字符串組;將排序第三的第一預(yù)設(shè)字符串和排序第三的第二預(yù)設(shè)字符串組成第三預(yù)設(shè)字符串組;
在步驟S205中,對(duì)于每一個(gè)預(yù)設(shè)字符串組,將該預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串、第二預(yù)設(shè)字符串以及位于該預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串之間的字符串分別確定為源編碼格式的語法字符串;
例如,對(duì)于第一預(yù)設(shè)字符串組,將第一預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串“<#”、第二預(yù)設(shè)字符串“#>”以及位于第一預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串“<#”與第二預(yù)設(shè)字符串“#>”之間的字符“$header”分別確定為源編碼格式的語法字符串。
對(duì)于第二預(yù)設(shè)字符串組,將第二預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串“<#”、第二預(yù)設(shè)字符串“#>”以及位于第二預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串“<#”與第二預(yù)設(shè)字符串“#>”之間的字符“each val,index in$items”分別確定為源編碼格式的語法字符串。
對(duì)于第三預(yù)設(shè)字符串組,將第三預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串“<#”、第二預(yù)設(shè)字符串“#>”以及位于第三預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串“<#”與第二預(yù)設(shè)字符串“#>”之間的字符“if$val.first”分別確定為源編碼格式的語法字符串。
在步驟S206中,將源代碼中的除確定出的源編碼格式的語法字符串之外的字符串 確定為數(shù)據(jù)字符串。
其中,在上述源代碼中,可以確定出除源編碼格式的語法字符串之外的其他字符串分別:位于排序第一的第一預(yù)設(shè)字符串“<#”之前的字符串“<h1>”、以及位于排序第一的第二預(yù)設(shè)字符串“#>”與排序第二的第一預(yù)設(shè)字符串“<#”之間的字符串“</h1>”,因此,可以將位于排序第一的第一預(yù)設(shè)字符串“<#”之前的字符串“<h1>”、以及位于排序第一的第二預(yù)設(shè)字符串“#>”與排序第二的第一預(yù)設(shè)字符串“<#”之間的字符串“</h1>”分別確定為數(shù)據(jù)字符串。
在本發(fā)明又一實(shí)施例中,參見圖3,步驟S102包括:
在步驟S301中,構(gòu)建源代碼對(duì)應(yīng)的抽象語法樹;
具體地,本步驟可以通過如下流程實(shí)現(xiàn),包括:
11)、獲取預(yù)設(shè)分析法;
預(yù)設(shè)分析法可以為L(zhǎng)R(1)分析法,LR(0)分析法或SLR分析法等,本發(fā)明對(duì)此不加以限定。
在本發(fā)明實(shí)施例中,優(yōu)先采用LR(1)分析法。
12)、根據(jù)預(yù)設(shè)分析法創(chuàng)建狀態(tài)機(jī);
13)、將源代碼中的所有字符串依次輸入狀態(tài)機(jī);
例如,將源代碼“<h1><#$header#></h1>
<#each val,index in$items#>
<#if$val.first#>”依次輸入狀態(tài)機(jī)。
14)、檢測(cè)是否將源代碼中的所有字符串全部輸入至狀態(tài)機(jī);
15)、當(dāng)將源代碼中的所有字符串全部輸入至狀態(tài)機(jī)時(shí),根據(jù)狀態(tài)機(jī)輸出的字符串生成源代碼對(duì)應(yīng)的抽象語法樹。
例如源代碼中的“<#if$val.first#>”對(duì)應(yīng)的抽象語法樹可以如圖4所示。
在步驟S302中,從抽象語法樹中獲取源代碼中的數(shù)據(jù)字符串和源編碼格式的語法字符串。
從圖4所示的抽象語法樹中獲取源編碼格式的語法字符串“<#”、“if$val.first”和“#>”。
在本發(fā)明又一實(shí)施例中,參見圖5,步驟S103包括:
在步驟S401中,獲取預(yù)先設(shè)置的源編碼格式的語法字符串與目標(biāo)編碼格式的語法 字符串之間的對(duì)應(yīng)關(guān)系;
其中,為了可以高效率地將源代碼中的源編碼格式的語法字符串替換為目標(biāo)編碼格式的語法字符串,技術(shù)人員事先在本地設(shè)置了源編碼格式的語法字符串與目標(biāo)編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系,在上述對(duì)應(yīng)關(guān)系中,每一個(gè)源編碼格式的語法字符串都對(duì)應(yīng)的一個(gè)目標(biāo)編碼格式的語法字符串。
例如,在本發(fā)明實(shí)施例中,源編碼格式為DSL語言支持的編碼格式,目標(biāo)編碼格式為PHP語言支持的編碼格式。
獲取的DSL語言支持的編碼格式的語法字符串與PHP語言支持的編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系可以如下表1所示。
表1
其中,本地還存儲(chǔ)有DSL語言支持的編碼格式的語法字符串與JS語言支持的編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系,DSL語言支持的編碼格式的語法字符串與velocity語言支持的編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系,DSL語言支持的編碼格式的語法字符串與asp語言支持的編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系等。
在步驟S402中,在上述對(duì)應(yīng)關(guān)系中獲取每一個(gè)源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串;
對(duì)于任一個(gè)源編碼格式的語法字符串,在上述對(duì)應(yīng)關(guān)系中查找與該源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串。對(duì)于其他每一源編碼格式的語法字符串,均執(zhí)行上述操作,如此實(shí)現(xiàn)在對(duì)應(yīng)關(guān)系中獲取每一個(gè)源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串。
例如,對(duì)于源代碼中的“<#each val,index in$items#>”,其中,源編碼格式的語法字符串包括“<#”、“each val,index in$items”和“#>”,因此可以首先在表1所示的對(duì)應(yīng)關(guān)系中查找源編碼格式的字符串“<#”對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串“<?PHP”,然后在表1所示的對(duì)應(yīng)關(guān)系中查找源編碼格式的字符串“each val,index in$items”對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串“foreach($items as$val=>$index)”,最后在表1所示的對(duì) 應(yīng)關(guān)系中查找源編碼格式的字符串“#>”對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串“?>”。
在步驟S403中,對(duì)于獲取的每一個(gè)目標(biāo)編碼格式的語法字符串,在抽象語法樹中,利用目標(biāo)編碼格式的語法字符串替換與目標(biāo)編碼格式的語法字符串對(duì)應(yīng)的源編碼格式的語法字符串。
具體的,遍歷上述抽象語法樹,當(dāng)遍歷到一個(gè)字符串時(shí),由于抽象語法樹中已經(jīng)標(biāo)記了每個(gè)字符串是數(shù)據(jù)字符串還是源編碼格式的語法字符串,因此,可以根據(jù)標(biāo)記直接確定出遍歷到的字符串是源編碼格式的語法字符串還是數(shù)據(jù)字符串;當(dāng)遍歷到的字符串為源編碼格式的語法字符串時(shí),從上述對(duì)應(yīng)關(guān)系中獲取遍歷到的源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串,直至遍歷完抽象語法樹為止。
其中,在遍歷上述抽象語法樹時(shí)可以采用深度遍歷策略,也可以采用廣度遍歷策略,本發(fā)明對(duì)此不加以限定。優(yōu)選地,本發(fā)明實(shí)施例采用深度遍歷策略遍歷上述抽象語法樹。
圖6是根據(jù)一示例性實(shí)施例示出的一種代碼轉(zhuǎn)換裝置的框圖。參照?qǐng)D6,該裝置包括:
接收模塊11,用于接收用戶輸入的對(duì)源編碼格式的源代碼進(jìn)行格式轉(zhuǎn)換的請(qǐng)求;所述請(qǐng)求中攜帶有所述源代碼和目標(biāo)編碼格式的標(biāo)識(shí),所述目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式與所述源編碼格式不同;
分析模塊12,用于根據(jù)所述源編碼格式對(duì)所述源代碼進(jìn)行分析,得到所述源代碼中包含的數(shù)據(jù)字符串和所述源編碼格式的語法字符串;
轉(zhuǎn)換模塊13,用于將所述源編碼格式的語法字符串轉(zhuǎn)換為目標(biāo)編碼格式對(duì)應(yīng)的語法字符串;所述目標(biāo)編碼格式為目標(biāo)編碼格式的標(biāo)識(shí)對(duì)應(yīng)的編碼格式;
結(jié)合模塊14,用于將所述數(shù)據(jù)字符串和所述目標(biāo)編碼格式對(duì)應(yīng)的語法字符串結(jié)合生成目標(biāo)編碼格式的目標(biāo)代碼。
通過本發(fā)明圖6所示的實(shí)施例的方法,當(dāng)技術(shù)人員事先根據(jù)源編碼格式編寫了一段具有某一功能的源代碼時(shí),如果要在某一語言的平臺(tái)上應(yīng)用具有該功能的代碼,該語言支持的編碼格式與源編碼格式不同,只需將源代碼的源編碼格式轉(zhuǎn)化為該語言支持的編碼格式,這樣就可以將轉(zhuǎn)換后的代碼應(yīng)用至該語言的平臺(tái)上,無需使得技術(shù)人員再根據(jù)該語言的平臺(tái)支持的編碼格式編寫一段具有該功能的代碼,從而可以降低人工成本。
其中,所述分析模塊12包括:
正則匹配單元,用于對(duì)所述源代碼進(jìn)行正則匹配;
第一獲取單元,用于在所述源代碼中獲取所述源編碼格式對(duì)應(yīng)的第一預(yù)設(shè)字符串和 第二預(yù)設(shè)字符串;獲取的第一預(yù)設(shè)字符串的個(gè)數(shù)與獲取的第二預(yù)設(shè)字符串的個(gè)數(shù)相同;
排序單元,用于將獲取到的第一預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序,以及將獲取到的第二預(yù)設(shè)字符串按照獲取的時(shí)間順序進(jìn)行排序;
組成單元,用于將次序相同第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串組成預(yù)設(shè)字符串組;
第一確定單元,用于對(duì)于每一個(gè)預(yù)設(shè)字符串組,將所述預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串、第二預(yù)設(shè)字符串以及位于所述預(yù)設(shè)字符串組中的第一預(yù)設(shè)字符串和第二預(yù)設(shè)字符串之間的字符串分別確定為所述源編碼格式的語法字符串;
第二確定單元,用于將所述源代碼中的除確定出的源編碼格式的語法字符串之外的字符串確定為數(shù)據(jù)字符串。
其中,所述分析模塊12包括:
構(gòu)建單元,用于構(gòu)建所述源代碼對(duì)應(yīng)的抽象語法樹;
第二獲取單元,用于從所述抽象語法樹中獲取所述源代碼中的數(shù)據(jù)字符串和所述源編碼格式的語法字符串。
其中,所述構(gòu)建單元包括:
獲取子單元,用于獲取預(yù)設(shè)分析法;
創(chuàng)建子單元,用于根據(jù)所述預(yù)設(shè)分析法創(chuàng)建狀態(tài)機(jī);
輸入子單元,用于將所述源代碼中的所有字符串依次輸入狀態(tài)機(jī);
檢測(cè)子單元,用于檢測(cè)是否將所述源代碼中的所有字符串全部輸入至所述狀態(tài)機(jī);
生成子單元,用于當(dāng)將所述源代碼中的所有字符串全部輸入至所述狀態(tài)機(jī)時(shí),根據(jù)所述狀態(tài)機(jī)輸出的字符串生成所述源代碼對(duì)應(yīng)的抽象語法樹。
其中,所述轉(zhuǎn)換模塊13包括:
第三獲取單元,用于獲取預(yù)先設(shè)置的源編碼格式的語法字符串與目標(biāo)編碼格式的語法字符串之間的對(duì)應(yīng)關(guān)系;
第四獲取單元,用于在所述對(duì)應(yīng)關(guān)系中獲取每個(gè)所述源編碼格式的語法字符串對(duì)應(yīng)的目標(biāo)編碼格式的語法字符串;
替換單元,用于對(duì)于獲取的每一個(gè)目標(biāo)編碼格式的語法字符串,在所述抽象語法樹中,利用所述目標(biāo)編碼格式的語法字符串替換與所述目標(biāo)編碼格式的語法字符串對(duì)應(yīng)的源編碼格式的語法字符串。
關(guān)于上述實(shí)施例中的裝置,其中各個(gè)模塊執(zhí)行操作的具體方式已經(jīng)在有關(guān)該方法的實(shí)施例中進(jìn)行了詳細(xì)描述,此處將不做詳細(xì)闡述說明。
本領(lǐng)域技術(shù)人員在考慮說明書及實(shí)踐這里公開的發(fā)明后,將容易想到本發(fā)明的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本發(fā)明的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本發(fā)明的一般性原理并包括本發(fā)明未公開的本技術(shù)領(lǐng)域中的公知常識(shí)或慣用技術(shù)手段。說明書和實(shí)施例僅被視為示例性的,本發(fā)明的真正范圍和精神由下面的權(quán)利要求指出。
應(yīng)當(dāng)理解的是,本發(fā)明并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本發(fā)明的范圍僅由所附的權(quán)利要求來限制。