專利名稱:一種源代碼生成方法
技術(shù)領(lǐng)域:
本發(fā)明涉及ー種以自然語言作為輸入的源代碼生成方法。
背景技術(shù):
目前,自然語言處理技術(shù)正逐步開始實(shí)用化(例如基于自然語言的編程工具,語音控制系統(tǒng)等),但是仍然處于比較初級(jí)的階段?,F(xiàn)有的自然語言處理技術(shù)通常只是將ー個(gè)自然語言字符串映射為ー個(gè)函數(shù)。例如將“發(fā)送短信”映射為手機(jī)內(nèi)的某個(gè)函數(shù)。當(dāng)然,將ー個(gè)自然語言字符串映射為多個(gè)函數(shù)的序列也很容易,因?yàn)檫@種做法等價(jià)于將這些函數(shù)封裝為ー個(gè)新函數(shù)。上述這些實(shí)現(xiàn)方法的本質(zhì)是建立“字符串”和“代碼段”之間的映射表,當(dāng)“字符 串”被輸入時(shí),執(zhí)行相應(yīng)的“代碼段”。當(dāng)然,這種映射可以是多對(duì)多的,例如同一個(gè)“字符串”在不同應(yīng)用環(huán)境下映射為不同“代碼段”;多個(gè)“字符串”映射為同一個(gè)“代碼段”。然而,這些方法存在以下的缺陷是“代碼段”是工程師預(yù)先寫好的,這意味著工程師要預(yù)先判定用戶會(huì)輸入哪些“字符串”,由于海量的用戶會(huì)有海量的差異化需求,因此,這些方法顯然不符合需求的差異化趨勢(shì)。
發(fā)明內(nèi)容
為了解決上述現(xiàn)有技術(shù)存在的問題,本發(fā)明g在提供ー種源代碼生成方法,以使自然語言字符串自動(dòng)生成代碼段,從而減少軟件開發(fā)工作量,滿足用戶的多種使用需求。本發(fā)明所述的ー種源代碼生成方法,包括以下步驟步驟SI,在數(shù)據(jù)庫(kù)中存儲(chǔ)字符串個(gè)例、與所述字符串個(gè)例對(duì)應(yīng)的字符串通例以及與所述字符串通例對(duì)應(yīng)的代碼段通例,其中,所述字符串個(gè)例為字符串通例的子集;步驟S2,在所述數(shù)據(jù)庫(kù)中檢索與外圍輸入的字符串匹配的字符串個(gè)例,若檢索得到該字符串個(gè)例,則執(zhí)行步驟S3,否則返回執(zhí)行所述步驟SI ;步驟S3,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S2中獲得的字符串個(gè)例對(duì)應(yīng)的字符串通例,井比較該字符串個(gè)例和字符串通例,生成該字符串個(gè)例和字符串通例的第一映身寸關(guān)系;步驟S4,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S3中獲得的字符串通例對(duì)應(yīng)的代碼段通例,并比較該字符串通例和代碼段通例,生成該字符串通例和代碼段通例的第二映身寸關(guān)系;步驟S5,根據(jù)所述第一映射關(guān)系以及所述第二映射關(guān)系,將所述步驟S4中獲得的代碼段通例替換生成源代碼。在上述的源代碼生成方法中,所述步驟SI還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)由所述字符串通例分解而成的多個(gè)擴(kuò)展字符串通例。在上述的源代碼生成方法中,包括在所述步驟S4之后執(zhí)行步驟S6,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S4中獲得的字符串通例對(duì)應(yīng)的多個(gè)擴(kuò)展字符串通例,并生成該字符串通例與多個(gè)擴(kuò)展字符串通例的第三映射關(guān)系;步驟S7,將所述步驟S6中的每個(gè)擴(kuò)展字符串通例作為ー個(gè)字符串通例,并在所述數(shù)據(jù)庫(kù)中檢索與每個(gè)字符串通例對(duì)應(yīng)的代碼段通例,若檢索得到代碼段通例,則執(zhí)行步驟S8,否則,根據(jù)所述第一映射關(guān)系,將所述擴(kuò)展字符串通例替換為擴(kuò)展字符串個(gè)例,并將該擴(kuò)展字符串個(gè)例作為字符串通例,在所述數(shù)據(jù)庫(kù)中檢索與該字符串通例對(duì)應(yīng)的代碼段通例,若檢索得到代碼段通例,則執(zhí)行步驟S8,否則返回執(zhí)行步驟SI ;步驟S8,比較所述步驟S7中的字符串通例和獲得的與其對(duì)應(yīng)的代碼段通例,井生成該字符串通例和代碼段通例的第四映射關(guān)系;步驟S9,根據(jù)所述第一映射關(guān)系、所述第三映射關(guān)系以及所述第四映射關(guān)系,將所述步驟S7中獲得的代碼段通例替換生成擴(kuò)展源代碼;步驟S10,根據(jù)所述第二映射關(guān)系以及所述第三映射關(guān)系,將多個(gè)所述步驟S9中獲得的擴(kuò)展源代碼嵌套進(jìn)所述步驟S4中獲得的代碼段通例中,生成源代碼。 在上述的源代碼生成方法中,所述步驟S6還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第三映射關(guān)系。在上述的源代碼生成方法中,所述步驟S8還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第四映射關(guān)系。在上述的源代碼生成方法中,所述步驟S3還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第一映射關(guān)系。在上述的源代碼生成方法中,所述步驟S4還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第二的映射關(guān)系。由于采用了上述的技術(shù)解決方案,本發(fā)明具有以下優(yōu)點(diǎn)I、提高軟件開發(fā)效率,降低軟件開發(fā)難度可以將工程師設(shè)計(jì)與現(xiàn)有編程工具實(shí)現(xiàn)的協(xié)作模式下的大部分工作簡(jiǎn)化到寫文檔的難度,同時(shí)大部分工作能忽略細(xì)節(jié)(例如,將有向圖壓縮為字符串,反復(fù)進(jìn)行),從而提高開發(fā)效率。例如,對(duì)智能手機(jī)和智能電視等產(chǎn)品而言,大多采用應(yīng)用商店的模式。降低軟件開發(fā)難度,意味著更多的人能參與應(yīng)用的開發(fā),從而獲得更多的應(yīng)用。更進(jìn)一歩的,可以使沒有編程經(jīng)驗(yàn)的人參與軟件開發(fā),從而獲得更好的應(yīng)用。例如讓醫(yī)生開發(fā)和藥品有關(guān)的軟件。2、改善電子產(chǎn)品的用戶體驗(yàn)采用本發(fā)明能根據(jù)用戶的不同需求,生成不同的軟件源代碼,類似于為每個(gè)用戶設(shè)計(jì)最適合他的軟件,從而改善用戶體驗(yàn)。一般的設(shè)計(jì)方法是以少數(shù)幾種設(shè)計(jì)滿足大多數(shù)用戶的共同需求,這樣做往往會(huì)忽略細(xì)節(jié)和少數(shù)用戶。例如有些人的手指比較粗。本發(fā)明則允許用戶在購(gòu)買產(chǎn)品后,以自然語言的方式修改一部分軟件以適應(yīng)自身的需求。例如把圖標(biāo)放大以適應(yīng)手指。當(dāng)然,這種差異化的需求是可以通過系統(tǒng)設(shè)置來解決的,但是問題在于工程師并不能預(yù)先判定會(huì)有哪些差異化的需求。在本發(fā)明中,只要將數(shù)據(jù)庫(kù)放在云端的服務(wù)器上,就能不斷増加支持的字符串,從而支持越來越多的差異化需求。
具體實(shí)施例方式下面結(jié)合實(shí)施例,對(duì)本發(fā)明予以詳細(xì)描述。本發(fā)明,即ー種源代碼生成方法,包括以下步驟步驟SI,在數(shù)據(jù)庫(kù)中存儲(chǔ)字符串個(gè)例、與字符串個(gè)例對(duì)應(yīng)的字符串通例以及與字符串通例對(duì)應(yīng)的代碼段通例,其中,字符串個(gè)例為字符串通例的子集;步驟S2,在數(shù)據(jù)庫(kù)中檢索與外圍輸入的字符串匹配的字符串個(gè)例,若檢索得到該字符串個(gè)例,則執(zhí)行步驟S3,否則返回執(zhí)行步驟SI ;步驟S3,在數(shù)據(jù)庫(kù)中檢索得到與步驟S2中獲得的字符串個(gè)例對(duì)應(yīng)的字符串通例,并比較該字符串個(gè)例和字符串通例,生成以及在數(shù)據(jù)庫(kù)中存儲(chǔ)該字符串個(gè)例和字符串通例的第一映射關(guān)系;步驟S4,在數(shù)據(jù)庫(kù)中檢索得到與步驟S3中獲得的字符串通例對(duì)應(yīng)的代碼段通例,并比較該字符串通例和代碼段通例,生成以及在數(shù)據(jù)庫(kù)中存儲(chǔ)該字符串通例和代碼段通例的第二映射關(guān)系;步驟S5,根據(jù)步驟S3中生成的字符串個(gè)例和字符串通例的第一映射關(guān)系以及步驟S4中生成的字符串通例和代碼段通例的第二映射關(guān)系,將步驟S4中獲得的代碼段通例替換生成源代碼。在本發(fā)明的源代碼生成方法中,步驟SI還包括在數(shù)據(jù)庫(kù)中存儲(chǔ)由字符串通例分割而成的多個(gè)擴(kuò)展字符串通例。在此情況下,本方法包括在步驟S4之后執(zhí)行步驟S6,在數(shù)據(jù)庫(kù)中檢索得到與步驟S4中獲得的字符串通例對(duì)應(yīng)的多個(gè)擴(kuò)展字符串通例,井生成以及在數(shù)據(jù)庫(kù)中存儲(chǔ)該字符串通例與多個(gè)擴(kuò)展字符串通例的第三映射關(guān)系;步驟S7,將步驟S6中的每個(gè)擴(kuò)展字符串通例作為ー個(gè)字符串通例,并在數(shù)據(jù)庫(kù)中檢索與每個(gè)字符串通例對(duì)應(yīng)的代碼段通例,若檢索得到代碼段通例,則執(zhí)行步驟S8,否則,根據(jù)步驟S3中生成的第一映射關(guān)系,將擴(kuò)展字符串通例替換為擴(kuò)展字符串個(gè)例,并將該擴(kuò)展字符串個(gè)例作為字符串通例,在數(shù)據(jù)庫(kù)中檢索與該字符串通例對(duì)應(yīng)的代碼段通例,若檢索得到代碼段通例,則執(zhí)行步驟S8,否則返回執(zhí)行步驟SI ;步驟S8,比較步驟S7中的字符串通例和獲得的與其對(duì)應(yīng)的代碼段通例,井生成以及在數(shù)據(jù)庫(kù)中存儲(chǔ)該字符串通例和代碼段通例的第四映射關(guān)系;步驟S9,根據(jù)步驟S3中生成的第一映射關(guān)系、步驟S6中生成的第三映射關(guān)系以及所述步驟S8中生成的第四映射關(guān)系,將步驟S7中獲得的代碼段通例替換生成擴(kuò)展源代碼;步驟S10,根據(jù)步驟S4中生成的第二映射關(guān)系以及步驟S6中生成的第三映射關(guān)系,將多個(gè)步驟S9中獲得的擴(kuò)展源代碼嵌套進(jìn)步驟S4中獲得的代碼段通例中,生成源代碼?;谏鲜霾襟E可知,在本發(fā)明步驟SI中提及的數(shù)據(jù)庫(kù)中需要保存以下信息I、字符串個(gè)例例如,“ 100”;
2、字符串通例例如,“數(shù)字”;通例和個(gè)例的關(guān)系是ー種可級(jí)聯(lián)的相對(duì)關(guān)系,也可以理解為分類,個(gè)例是通例的一個(gè)子集或特例,例如,“ 100 ”是“ 10進(jìn)制數(shù)字”的個(gè)例,“ 10進(jìn)制數(shù)字”是“數(shù)字”的個(gè)例;個(gè)例和通例是相對(duì)而言的概念,例如“ 10進(jìn)制數(shù)字”相對(duì)“ 100”是通例,相對(duì)“數(shù)字”是個(gè)例;假如兩個(gè)字符串分別包含“個(gè)例”和“通例”,且其它部分完全一致,那么這兩個(gè)字符串也互為“個(gè)例”和“通例”,例如“ 100+100 = 200”是“數(shù)字+數(shù)字=數(shù)字”的個(gè)例;假如兩段源代碼分別包含“個(gè)例”和“通例” ,且其它部分完全一致,那么這兩個(gè)源代碼也互為“個(gè)例”和“通例”,例如“ SendMsg ( “Tom”)” 是 “ SendMsg ( “人名”)”的個(gè)例;3、第一映射關(guān)系例如,字符串個(gè)例“ 100”對(duì)應(yīng)字符串通例“數(shù)字”,則第一映射關(guān)系為“數(shù)字是100” ;4、代碼段通例既可以是字符串形態(tài),也可以是算法形態(tài),而且并非一定是一行代碼,也可以是多行代碼,包括預(yù)置函數(shù)、鏈表等算法、加法等運(yùn)算以及If等控制語句等,例如,字符串形態(tài)的“數(shù)字=數(shù)字”,算法形態(tài)的“輸出數(shù)字” “輸出=” “輸出數(shù)字”,代碼段通例隨源代碼程序語言的變化而變化,例如c語言和Java語言對(duì)應(yīng)的代碼段通例是不同的;不同的軟件中也有不同的代碼段通例,例如不同操作系統(tǒng)中獲取系統(tǒng)時(shí)間的函數(shù)就不同;一部分“字符串通例對(duì)應(yīng)的代碼段通例”,其實(shí)就是某個(gè)函數(shù)的使用方法,例如“獲得系統(tǒng)時(shí)間字符串”對(duì)應(yīng)于函數(shù)“字符串=GetSysTimeO ”;本發(fā)明說明的是ー種通用的方法,而不限于具體編程語言或軟件;5、第二映射關(guān)系例如,字符串通例“將數(shù)字賦值給數(shù)字”對(duì)應(yīng)代碼段通例“數(shù)字=數(shù)字”,則第二映射關(guān)系為“代碼段通例的第I個(gè)數(shù)字是字符串通例的第2個(gè)數(shù)字,代碼段通例的第2個(gè)數(shù)字是字符串通例的第I個(gè)數(shù)字”;6、擴(kuò)展字符串通例例如,字符串個(gè)例“如果a大于O那么b等于O”對(duì)應(yīng)字符串通例“如果數(shù)據(jù)大于數(shù)據(jù)那么數(shù)據(jù)等于數(shù)據(jù)”,則該字符串通例可分解為第一個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”和第二個(gè)擴(kuò)展字符串通例“數(shù)據(jù)等于數(shù)據(jù)”;7、第三映射關(guān)系例如,字符串通例“如果數(shù)據(jù)大于數(shù)據(jù)那么數(shù)據(jù)等于數(shù)據(jù)”對(duì)應(yīng)第一個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”和第二個(gè)擴(kuò)展字符串通例“數(shù)據(jù)等于數(shù)據(jù)”,則第三映射關(guān)系為“字符串通例的第I個(gè)數(shù)字為第一個(gè)擴(kuò)展字符串通例中的第I個(gè)數(shù)字,字符串通例的第2個(gè)數(shù)字為第一個(gè)擴(kuò)展字符串通例中的第2個(gè)數(shù)字,字符串通例的第3個(gè)數(shù)字為第ニ個(gè)擴(kuò)展字符串通例中的第I個(gè)數(shù)字,字符串通例的第4個(gè)數(shù)字為第二個(gè)擴(kuò)展字符串通例中的第2個(gè)數(shù)字”;8、第四映射關(guān)系這種關(guān)系的本質(zhì)與第二映射關(guān)系相同,例如,第一個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”作為字符串通例時(shí)對(duì)應(yīng)代碼段通例“數(shù)據(jù)> 數(shù)據(jù)”,則第四映射關(guān)系為“代碼段通例的第I個(gè)數(shù)字是第一個(gè)擴(kuò)展字符串通例的第I個(gè)數(shù)字,代碼段通例的第2個(gè)數(shù)字是第一個(gè)擴(kuò)展字符串通例的第2個(gè)數(shù)字”。本發(fā)明步驟S2中提及的外圍輸入的字符串,在本發(fā)明中默認(rèn)為已經(jīng)經(jīng)過正確識(shí)別的自然語言字符串(自然語言的識(shí)別是指將句子拆離為詞;識(shí)別詞和句子的含義;字符串的模糊匹配等分析算法),本發(fā)明僅解決如何將其替換生成源代碼的問題。需要注意的是,數(shù)據(jù)庫(kù)中的信息是可以不斷添加的,使用現(xiàn)有編程工具的工程師在使用過程中可以不斷増加信息,或者可以這樣理解向數(shù)據(jù)庫(kù)添加信息=教工具寫代碼;利用數(shù)據(jù)庫(kù)的信息生成代碼=用工具生成代碼;具體來說I、當(dāng)工具無法生成代碼時(shí)就應(yīng)該教工具寫代碼;由于數(shù)據(jù)庫(kù)之間可以同步信息,所以只要有ー個(gè)人教會(huì)工具生成某種代碼,所有的工具就都學(xué)會(huì)了。2、當(dāng)工具生成源代碼時(shí),同時(shí)也在建立映射關(guān)系A(chǔ))例如完成了函數(shù)Get_SySTime,同時(shí)向工具說明該函數(shù)的作用為“獲得系統(tǒng)時(shí)間”;B)工具在“獲得系統(tǒng)時(shí)間”和“數(shù)據(jù)=Get_SysTime O ”之間建立對(duì)應(yīng)關(guān)系,其中需要工程師輸入必要的信息;C)換句話講,用工具生成某個(gè)模塊源代碼的過程,就是為其它模塊準(zhǔn)備信息的過程。嚴(yán)格意義上來說,數(shù)據(jù)庫(kù)中既可以保存“字符串個(gè)例”和“代碼段個(gè)例”之間的映射關(guān)系,也可以保存“字符串通例”和“代碼段通例”之間的映射關(guān)系,這并不矛盾,就像ー個(gè)人 既會(huì)“1+1 ”,也會(huì)“整數(shù)+整數(shù)”,還會(huì)“實(shí)數(shù)+實(shí)數(shù)”,而差異在于,通例化程度越高,需要保存的信息越少,因此,本發(fā)明中選擇保存“字符串通例”和“代碼段通例”之間的映射關(guān)系。下面通過舉例說明上述步驟S3-步驟S5。例如,與外圍輸入的字符串匹配的字符串個(gè)例為“將datal賦值給data2” ;步驟S3,檢索到與字符串個(gè)例“將datal賦值給data2”對(duì)應(yīng)的字符串通例“將數(shù)字賦值給數(shù)字”,同時(shí)比較兩者后,生成并存儲(chǔ)第一映射關(guān)系Ml為字符串通例的第I個(gè)數(shù)字是datal,字符串通例的第2個(gè)數(shù)字是data2 (該第一映射關(guān)系Ml來自于分析過程datal和data2被替換為數(shù)字);
步驟S4,檢索到與字符串通例“將數(shù)字賦值給數(shù)字”對(duì)應(yīng)的代碼段通例“數(shù)字=數(shù)字”,同時(shí)比較兩者后,生成并存儲(chǔ)第二映射關(guān)系M2為代碼段通例的第I個(gè)數(shù)字是字符串通例的第2個(gè)數(shù)字,代碼段通例的第2個(gè)數(shù)字是字符串通例的第I個(gè)數(shù)字;步驟S5,根據(jù)第一映射關(guān)系Ml和第二映射關(guān)系M2,將代碼段通例“數(shù)字=數(shù)字”替換為源代碼“data2 = datal” ;本實(shí)施例中,這一“替換”的過程可采用現(xiàn)有的編程手段實(shí)現(xiàn),例如,利用華亞微電子公司設(shè)計(jì)的編程工具實(shí)現(xiàn);其原理如下(I)掃描代碼段通例,找到其中包含的字符串通例第I個(gè)“數(shù)字”和第2個(gè)“數(shù)字”;(2)由第一映射關(guān)系Ml和第二映射關(guān)系M2獲得第I個(gè)數(shù)字是data2,第2個(gè)數(shù) (Ιβ βΙ ;(3)將data2和datal代入“數(shù)字=數(shù)字”,即,通過簡(jiǎn)單的字符串替換就可以得到源代碼“data2 = datal” 了。下面通過舉例說明上述步驟S3、步驟S4、步驟S6-步驟S10。例如,與外圍輸入的字符串匹配的字符串個(gè)例為“如果a大于O那么b等于O” ;步驟S3,檢索到與字符串個(gè)例“如果a大于O那么b等于O”對(duì)應(yīng)的字符串通例“如果數(shù)據(jù)大于數(shù)據(jù)那么數(shù)據(jù)等于數(shù)據(jù)”,同時(shí)比較兩者后,生成并存儲(chǔ)第一映射關(guān)系Ml為字符串通例的第I個(gè)數(shù)字是a,字符串通例的第2個(gè)數(shù)字是O,字符串通例的第3個(gè)數(shù)字是b,字符串通例的第4個(gè)數(shù)字是O;步驟S4,檢索到與字符串通例“如果數(shù)據(jù)大于數(shù)據(jù)那么數(shù)據(jù)等于數(shù)據(jù)”對(duì)應(yīng)的代碼段通例“If (X) {X} ”,同時(shí)比較兩者后,生成并存儲(chǔ)第二映射關(guān)系M2為代碼段通例的第I個(gè)X是字符串通例中的“數(shù)據(jù)大于數(shù)據(jù)”,代碼段通例的第2個(gè)X是字符串通例的“數(shù)據(jù)等于數(shù)據(jù)”;步驟S6,檢索到與字符串通例“如果數(shù)據(jù)大于數(shù)據(jù)那么數(shù)據(jù)等于數(shù)據(jù)”對(duì)應(yīng)的第一個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”和第二個(gè)擴(kuò)展字符串通例“數(shù)據(jù)等于數(shù)據(jù)”,同時(shí)生成并存儲(chǔ)第三映射關(guān)系M3為字符串通例的第I個(gè)數(shù)字為第一個(gè)擴(kuò)展字符串通例中的第I個(gè)數(shù)字,字符串通例的第2個(gè)數(shù)字為第一個(gè)擴(kuò)展字符串通例中的第2個(gè)數(shù)字,字符串通例的第3個(gè)數(shù)字為第二個(gè)擴(kuò)展字符串通例中的第I個(gè)數(shù)字,字符串通例的第4個(gè)數(shù)字為第二個(gè)擴(kuò)展字符串通例中的第2個(gè)數(shù)字;步驟S7,檢索到第一個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”作為字符串通例時(shí)對(duì)應(yīng)的代碼段通例“數(shù)據(jù)> 數(shù)據(jù)”,檢索到第二個(gè)擴(kuò)展字符串通例“數(shù)據(jù)等于數(shù)據(jù)”作為字符串通例時(shí)對(duì)應(yīng)的代碼段通例“數(shù)據(jù)=數(shù)據(jù)”;步驟S8,比較第一個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”和與其對(duì)應(yīng)的代碼段通例 “數(shù)據(jù)>數(shù)據(jù)”后,生成并存儲(chǔ)第四映射關(guān)系M4為代碼段通例的第I個(gè)數(shù)字是第一個(gè)擴(kuò)展字符串通例的第I個(gè)數(shù)字,代碼段通例的第2個(gè)數(shù)字是第一個(gè)擴(kuò)展字符串通例的第2個(gè)數(shù)字;比較第二個(gè)擴(kuò)展字符串通例“數(shù)據(jù)大于數(shù)據(jù)”和與其對(duì)應(yīng)的代碼段通例“數(shù)據(jù)=數(shù)據(jù)”后,生成并存儲(chǔ)第四映射關(guān)系M4為代碼段通例的第I個(gè)數(shù)字是第二個(gè)擴(kuò)展字符串通例的第I個(gè)數(shù)字,代碼段通例的第2個(gè)數(shù)字是第二個(gè)擴(kuò)展字符串通例的第2個(gè)數(shù)字;步驟S9,根據(jù)第一映射關(guān)系Ml、第三映射關(guān)系M3以及第四映射關(guān)系M4,將步驟S7中獲得的代碼段通例“數(shù)據(jù)>數(shù)據(jù)”和“數(shù)據(jù)=數(shù)據(jù)”分別替換生成擴(kuò)展源代碼“a > O”和“b = O”;步驟S10,根據(jù)第二映射關(guān)系M2以及第三映射關(guān)系M3,將多個(gè)步驟S8中獲得的擴(kuò)展源代碼嵌套進(jìn)步驟S4中獲得的代碼段通例“If (X) {X} ”中,生成源代碼“If (a > O) {b =O},,。此處再舉出下例以說明上述步驟S7中的另ー種情況。例如,字符串個(gè)例為“訂購(gòu)10蘋果”,檢索到的字符串通例為“訂購(gòu)重量斤貨物”,檢索到由字符串通例“訂購(gòu)重量斤貨物”分解形成的3個(gè)擴(kuò)展字符串通例“查詢貨物的單價(jià)”、“總價(jià)=單價(jià)*重量”和“支付總價(jià)”,在這里,“ 10”是“重量”的個(gè)例,“蘋果”是“貨物”的個(gè)例;在檢索3個(gè)擴(kuò)展字符串通例對(duì)應(yīng)的代碼段通例過程中,無法檢索到與擴(kuò)展字符串通例“查詢貨物的單價(jià)”對(duì)應(yīng)的代碼段通例,此時(shí)就嘗試將該擴(kuò)展字符串通例內(nèi)部的各個(gè)“通例”反向替換為“個(gè)例”,即替換為擴(kuò)展字符串個(gè)例來查找代碼段通例(各種組合形式中只要有一個(gè)能找到即可),此處,將擴(kuò)展字符串通例“查詢貨物的單價(jià)”替換為擴(kuò)展字符串個(gè)例“查詢蘋果的單價(jià)”,并檢索到對(duì)應(yīng)的代碼段通例“單價(jià)=GetApplePrice O ”;其他的兩個(gè)擴(kuò)展字符串通例“總價(jià)=單價(jià)*重量”和“支付總價(jià)”則分別對(duì)應(yīng)代碼段通例“總價(jià)=單價(jià)*重量”和“Pay (總價(jià))”;此處需要注意的是,在上述代碼段通例中出現(xiàn)的兩個(gè)特殊的詞“單價(jià)”和“總價(jià)”,在將代碼段通例替換為源代碼的過程,也需要將這兩個(gè)詞替換,然后在原始的字符串個(gè)例為“訂購(gòu)10蘋果”中并沒有出現(xiàn)這兩個(gè)詞,因此,這種情況下就需要自動(dòng)生成ー個(gè)不重復(fù)的臨時(shí)字符串,作為臨時(shí)變量,其類型可以由使用的地方確定,例如函數(shù)GetApplePrice的返回值類型;臨時(shí)字符串指將字符串通例分解為多個(gè)擴(kuò)展字符串通例后出現(xiàn)的字符串,例如此處的“單價(jià)”和“總價(jià)”,定義臨時(shí)字符串的信息也保存于第三映射關(guān)系中;不重復(fù)是指源代碼中的變量名不能重復(fù),例如前綴+遞增的數(shù)值,ABCD_00000000001,生成源代碼時(shí),字符串“定義單價(jià)”對(duì)應(yīng)于“int ABCD_00000000001”。代碼段通例中所有用到“單價(jià)”的地方均替換為 ABCD_00000000001。又,如之前所述,本發(fā)明中的“個(gè)例”和“通例”之間是可以多層級(jí)聯(lián)的,所以可以通過多層級(jí)聯(lián)減少需要維護(hù)的映射關(guān)系數(shù)量。例如上例中可以認(rèn)為,“重量”、“單價(jià)”、“總價(jià)”都是“數(shù)字”的個(gè)例,因此,擴(kuò)展字符串通例“總價(jià)=單價(jià)*重量”可以作為ー個(gè)字符串個(gè)例,來替換成字符串通例“數(shù)字=數(shù)字*數(shù)字”,也就是說,這一字符串通例“數(shù)字=數(shù)字*數(shù)字”能解決所有乘法的問題,因此用戶并不需要維護(hù)“重量”、“單價(jià)”、“總價(jià)”等字符串之間的乘法關(guān)系。需要注意的是,當(dāng)同一個(gè)字符串多次出現(xiàn)時(shí)需要做區(qū)分,例如上例中“數(shù)字”出現(xiàn)了 3次,其中ー種區(qū)分方法的可以是在分析過程中將字符編碼長(zhǎng)度擴(kuò)展幾個(gè)字節(jié)(例如從Unicode的2字節(jié)編碼格式擴(kuò)展為4字節(jié)),然后在擴(kuò)展部分存儲(chǔ)偏移量,分析結(jié)束后再轉(zhuǎn) 換回原有編碼格式,這些都是現(xiàn)有技術(shù)中常規(guī)的技術(shù)手段。本發(fā)明中,可以將字符串通例分解為幾個(gè)擴(kuò)展字符串通例的鏈?zhǔn)叫蛄?,?shí)際上也可以分解為類似于流程圖的有向圖序列,例如“如果***,那么***,否則***”;有向圖中的每個(gè)結(jié)點(diǎn)是擴(kuò)展字符串通例,并且每個(gè)擴(kuò)展字符串通例都可以分解為更加細(xì)節(jié)的有向圖,或者對(duì)應(yīng)著某個(gè)代碼段通例。有向圖的鏈接關(guān)系則對(duì)應(yīng)著if、for、Switch等選擇性的代碼段通例,例如“if(***) {***}else{***} ”。當(dāng)然,這種有向圖序列和流程圖還是有本質(zhì)差異的通過現(xiàn)有的編程工具可以根據(jù)這種有向圖序列生成源代碼,而軟件中的流程圖需要工程師手動(dòng)編寫源代碼。由此看來,本方法能夠?qū)?fù)雜的有向圖壓縮為ー個(gè)字符串,其實(shí)質(zhì)是信息的壓縮,且這個(gè)壓縮過程可以反復(fù)進(jìn)行,等價(jià)于if等控制語句的反復(fù)嵌套,從而將信息壓縮到極限,對(duì)使用“字符串通例”的人而言,完全可以忽略其中包含的細(xì)節(jié)性信息。另外,本發(fā)明的步驟中還提及了返回步驟SI的情況,這是因?yàn)椹`開始就在數(shù)據(jù)庫(kù)中找不到字符串個(gè)例,即,說明數(shù)據(jù)庫(kù)缺少信息,報(bào)告用戶要求添加信息即可;或者在字符串通例分解的過程中,找不到對(duì)應(yīng)的代碼段通例,從而導(dǎo)致生成源代碼失?。缓笳呤莻€(gè)可回退的分析過程,即,字符串引入通例和個(gè)例的映射關(guān)系后存在很多不同的解釋,分析過程是逐漸嘗試各種可能,直至有ー種成功或全部失敗,假如失敗,則也說明數(shù)據(jù)庫(kù)缺少信息,報(bào)告用戶要求添加信息即可。基于上述說明可知,本方法應(yīng)用的前提是建立數(shù)據(jù)庫(kù),這個(gè)數(shù)據(jù)庫(kù)可以保存在云端的服務(wù)器上,保存字符串間的個(gè)例和通例關(guān)系,字符串通例對(duì)應(yīng)的代碼段通例,字符串通例間的擴(kuò)展型映射關(guān)系。而并不需要預(yù)先判斷有哪些字符串,相關(guān)的信息可以在運(yùn)行過程中不斷添加,換句話說使用者并不需要猜測(cè)使用者會(huì)輸入哪些字符串,只是在出現(xiàn)工具無法處理的字符串時(shí)添加這個(gè)字符串,并且任何ー個(gè)使用者都可以添加他需要的字符串。并且由于信息庫(kù)之間可以同步信息,所以只要有ー個(gè)使用者輸入了某個(gè)字符串所有人都可以用。這看似巨大的工作量其實(shí)是由所有的使用者分擔(dān)的,使用者越多,每個(gè)人分到的工作量越小。本發(fā)明可以有以下應(yīng)用模式
模式I、用戶是工程師,例如,用于開發(fā)自動(dòng)化編程工具。在這種模式下,可利用現(xiàn)有編程工具根據(jù)工程師輸入的字符串生成源代碼。而軟件開發(fā)中有一部分工作是現(xiàn)有編程工具無法自動(dòng)完成的(例如視頻編解碼算法等),則這個(gè)部分的工作仍然由工程師手動(dòng)完成,因此,這種模式其實(shí)是工程師和現(xiàn)有編程工具協(xié)作完成軟件的過程,即,工程師設(shè)計(jì),工具實(shí)現(xiàn)。例如工程師指定某個(gè)函數(shù)的作用為“向鏈表p_chain插入新結(jié)點(diǎn)p_node” (這是字符串個(gè)例,所以含有P_chain等),檢索到字符串通例“向鏈表字符串插入新結(jié)點(diǎn)字符串”,就根據(jù)通例對(duì)應(yīng)的代碼段通例生成源代碼,再將代碼段通例中的字符串替換為P_chain 等。這種模式下,工具的使用者可以分類兩種,資深工程師負(fù)責(zé)輸入字符串通例、代碼段通例以及各種它們之間的對(duì)應(yīng)關(guān)系,通過信息庫(kù)之間同步信息,所有工程師都可以使用這些信息;普通工程師負(fù)責(zé)輸入字符串個(gè)例。對(duì)普通工程師而言,他完全可以在不了解技術(shù)細(xì)節(jié)的情況下完成軟件開發(fā),從而降低工作難度。 模式2、用戶是普通消費(fèi)者,例如,用于實(shí)現(xiàn)增強(qiáng)語音控制的分析算法。在這種模式下,可利用算法根據(jù)用戶輸入的字符串生成源代碼,用戶輸入字符串的途徑可以是語音識(shí)別。當(dāng)然,由于沒有工程師協(xié)助,這種模式并不適用于復(fù)雜軟件,只能基于“預(yù)置函數(shù)”拼接出適合用戶需求的功能,通常體現(xiàn)為應(yīng)用軟件,此處的“預(yù)置函數(shù)”是指工程師預(yù)先編寫的軟件模塊中所包含的函數(shù),這些模塊被預(yù)置在產(chǎn)品中,例如數(shù)據(jù)庫(kù)、文件系統(tǒng)等等。例如用戶要求“播放第10個(gè)電視頻道”(這是字符串個(gè)例),根據(jù)算法檢索到字符串通例“播放第數(shù)字個(gè)電視頻道”,然后擴(kuò)展為“從數(shù)據(jù)庫(kù)獲得第數(shù)字個(gè)電視頻道的編號(hào)”和“根據(jù)編號(hào)播放電視頻道”,然后替換為源代碼。這種模式下生成的代碼的編程語言應(yīng)該選用解釋型語言,例如Action Script等。同時(shí)數(shù)據(jù)庫(kù)要保存在云端的服務(wù)器中,以便不斷増加所能支持的字符串。例如用戶向手機(jī)說“屏蔽所有來自上海的電話”,這個(gè)字符串被發(fā)送回手機(jī)公司的云端服務(wù)器,服務(wù)器嘗試根據(jù)字符串修改接電話模塊。假如目前還不支持,則返回失敗并向維護(hù)工程師報(bào)告。維護(hù)工程師向數(shù)據(jù)庫(kù)添加相關(guān)信息后,再有這ー類指令被發(fā)送到服務(wù)器,就能自動(dòng)生成源代碼并發(fā)送回手機(jī)了。本發(fā)明和下載應(yīng)用程序是有差別的本發(fā)明中用戶僅僅以自然語言陳述自己的需求即可,既不需要查找應(yīng)用程序,也不需要下載和安裝。本發(fā)明更適用于微小或細(xì)節(jié)的修改。模式2可以和模式I協(xié)作,即工程師在模式I下完成“預(yù)置函數(shù)”,普通消費(fèi)者在模式2下基于“預(yù)置函數(shù)”拼接出自己喜歡的功能。以上所述的,僅為本發(fā)明的較佳實(shí)施例,并非用以限定本發(fā)明的范圍,本發(fā)明的上述實(shí)施例還可以做出各種變化。即凡是依據(jù)本發(fā)明申請(qǐng)的權(quán)利要求書及說明書內(nèi)容所作的簡(jiǎn)單、等效變化與修飾,皆落入本發(fā)明專利的權(quán)利要求保護(hù)范圍。本發(fā)明未詳盡描述的均為常規(guī)技術(shù)內(nèi)容。
權(quán)利要求
1.ー種源代碼生成方法,其特征在于,所述方法包括以下步驟 步驟Si,在數(shù)據(jù)庫(kù)中存儲(chǔ)字符串個(gè)例、與所述字符串個(gè)例對(duì)應(yīng)的字符串通例以及與所述字符串通例對(duì)應(yīng)的代碼段通例,其中,所述字符串個(gè)例為字符串通例的子集; 步驟S2,在所述數(shù)據(jù)庫(kù)中檢索與外圍輸入的字符串匹配的字符串個(gè)例,若檢索得到該字符串個(gè)例,則執(zhí)行步驟S3,否則返回執(zhí)行所述步驟SI ; 步驟S3,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S2中獲得的字符串個(gè)例對(duì)應(yīng)的字符串通例,井比較該字符串個(gè)例和字符串通例,生成該字符串個(gè)例和字符串通例的第一映射關(guān)系; 步驟S4,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S3中獲得的字符串通例對(duì)應(yīng)的代碼段通例,并比較該字符串通例和代碼段通例,生成該字符串通例和代碼段通例的第二映射關(guān)系; 步驟S5,根據(jù)所述第一映射關(guān)系以及所述第二映射關(guān)系,將所述步驟S4中獲得的代碼段通例替換生成源代碼。
2.根據(jù)權(quán)利要求I所述的源代碼生成方法,其特征在于,所述步驟SI還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)由所述字符串通例分解而成的多個(gè)擴(kuò)展字符串通例。
3.根據(jù)權(quán)利要求2所述的源代碼生成方法,其特征在干,所述方法包括在所述步驟S4之后執(zhí)行 步驟S6,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S4中獲得的字符串通例對(duì)應(yīng)的多個(gè)擴(kuò)展字符串通例,并生成該字符串通例與多個(gè)擴(kuò)展字符串通例的第三映射關(guān)系; 步驟S7,將所述步驟S6中的每個(gè)擴(kuò)展字符串通例作為ー個(gè)字符串通例,并在所述數(shù)據(jù)庫(kù)中檢索與每個(gè)字符串通例對(duì)應(yīng)的代碼段通例,若檢索得到代碼段通例,則執(zhí)行步驟S8,否貝1J,根據(jù)所述第一映射關(guān)系,將所述擴(kuò)展字符串通例替換為擴(kuò)展字符串個(gè)例,并將該擴(kuò)展字符串個(gè)例作為字符串通例,在所述數(shù)據(jù)庫(kù)中檢索與該字符串通例對(duì)應(yīng)的代碼段通例,若檢索得到代碼段通例,則執(zhí)行步驟S8,否則返回執(zhí)行步驟SI ; 步驟S8,比較所述步驟S7中的字符串通例和獲得的與其對(duì)應(yīng)的代碼段通例,井生成該字符串通例和代碼段通例的第四映射關(guān)系; 步驟S9,根據(jù)所述第一映射關(guān)系、所述第三映射關(guān)系以及所述第四映射關(guān)系,將所述步驟S7中獲得的代碼段通例替換生成擴(kuò)展源代碼; 步驟S10,根據(jù)所述第二映射關(guān)系以及所述第三映射關(guān)系,將多個(gè)所述步驟S9中獲得的擴(kuò)展源代碼嵌套進(jìn)所述步驟S4中獲得的代碼段通例中,生成源代碼。
4.根據(jù)權(quán)利要求3所述的源代碼生成方法,其特征在于,所述步驟S6還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第三映射關(guān)系。
5.根據(jù)權(quán)利要求3或4所述的源代碼生成方法,其特征在于,所述步驟S8還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第四映射關(guān)系。
6.根據(jù)權(quán)利要求1、2、3或4所述的源代碼生成方法,其特征在于,所述步驟S3還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第一映射關(guān)系。
7.根據(jù)權(quán)利要求6所述的源代碼生成方法,其特征在于,所述步驟S4還包括在所述數(shù)據(jù)庫(kù)中存儲(chǔ)所述第二的映射關(guān)系。
全文摘要
本發(fā)明涉及一種源代碼生成方法,包括以下步驟步驟S1,在數(shù)據(jù)庫(kù)中存儲(chǔ)字符串個(gè)例、與所述字符串個(gè)例對(duì)應(yīng)的字符串通例以及與所述字符串通例對(duì)應(yīng)的代碼段通例,其中,所述字符串個(gè)例為字符串通例的子集;步驟S2,在所述數(shù)據(jù)庫(kù)中檢索與外圍輸入的字符串匹配的字符串個(gè)例,若檢索得到該字符串個(gè)例,則執(zhí)行步驟S3,否則返回執(zhí)行所述步驟S1;步驟S3,在所述數(shù)據(jù)庫(kù)中檢索得到與所述步驟S2中獲得的字符串個(gè)例對(duì)應(yīng)的字符串通例,并比較該字符串個(gè)例和字符串通例,生成該字符串個(gè)例和字符串通例的第一映射關(guān)系。本發(fā)明可以使自然語言字符串自動(dòng)生成代碼段,從而減少軟件開發(fā)工作量,滿足用戶的多種使用需求。
文檔編號(hào)G06F9/44GK102707948SQ20121012664
公開日2012年10月3日 申請(qǐng)日期2012年4月26日 優(yōu)先權(quán)日2012年4月26日
發(fā)明者付晶, 李知偉, 王巖峰, 董琦, 靳文輝 申請(qǐng)人:華亞微電子(上海)有限公司