本發(fā)明涉及一種語言解析方法及其裝置,尤其是一種解釋型語言的解析方法及其裝置和計(jì)算機(jī)系統(tǒng)。
背景技術(shù):
相對于編譯型語言存在的,源代碼不是直接翻譯成機(jī)器語言,而是先翻譯成中間代碼,再由解釋器對中間代碼進(jìn)行解釋運(yùn)行。比如Python/JavaScript/Perl/Shell等都是計(jì)算機(jī)程序語言中的解釋型語言。
現(xiàn)有的解釋型語言的解析過程中,往往借助其他語言工具來解析、翻譯、執(zhí)行,然后再把結(jié)果返還,這就造成了解釋效率的降低,并且非常依賴語言工具對語言的解析,導(dǎo)致解釋型語言的解析不具有通用性。
此外現(xiàn)有的解釋型語言的解析僅僅只能針對整個(gè)代碼塊起作用,對代碼的解釋和執(zhí)行無法滿足即時(shí)性的要求。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題是為了克服現(xiàn)有技術(shù)的解析方法需要借助其他語言來解析、翻譯、執(zhí)行,然后再把結(jié)果返還,而且只能對整個(gè)代碼塊進(jìn)行解析的缺陷,提供了一種解釋型語言的解析方法及其裝置和計(jì)算機(jī)系統(tǒng),不依賴其他語言和工具,并且能偶即時(shí)、增量地解釋和執(zhí)行用戶輸入的代碼。
本發(fā)明是通過下述技術(shù)方案來解決上述技術(shù)問題的:
本發(fā)明提供了一種解釋型語言的解析方法,其特點(diǎn)是,所述解釋型語言的解析方法包括以下步驟:
對獲取的代碼的每個(gè)最小詞法單元增加標(biāo)簽;
檢測到觸發(fā)通知時(shí),基于代碼中標(biāo)簽將代碼轉(zhuǎn)化為多叉樹;
逆序遞歸遍歷所述多叉樹。
本發(fā)明通過對最小語法單元增加標(biāo)簽對代碼的語法進(jìn)行增強(qiáng),進(jìn)而能夠?qū)⒋a轉(zhuǎn)換為多叉樹的形式,并且還利用觸發(fā)通知來標(biāo)識可以解析和執(zhí)行代碼,從而實(shí)現(xiàn)對解釋型語言的通用、自解析和增量的解釋和執(zhí)行。
較佳地,基于代碼中標(biāo)簽將代碼轉(zhuǎn)化為多叉樹后,計(jì)算多叉樹的散列結(jié)果;
當(dāng)所述散列結(jié)果與存儲的上次解析散列結(jié)果不相同時(shí),逆序遞歸遍歷所述多叉樹,并存儲所述散列結(jié)果作為上次解析散列結(jié)果。
本發(fā)明還利用代碼散列結(jié)果來判斷代碼是否曾經(jīng)執(zhí)行過,從而節(jié)省語言解析的資源,并且結(jié)合觸發(fā)通知,實(shí)現(xiàn)代碼連續(xù)屬于與連續(xù)解析的結(jié)合,從而達(dá)到即時(shí)地代碼解析的效果。
優(yōu)選地,所述散列結(jié)果通過MD5或SHA散列算法計(jì)算得到。
較佳地,建立兩個(gè)進(jìn)程執(zhí)行所述解釋型語言的解析方法,所述兩個(gè)進(jìn)程相互鎖定,并且一個(gè)進(jìn)程處于工作狀態(tài),另一個(gè)進(jìn)程處于休眠狀態(tài)。
優(yōu)選地,當(dāng)處于工作狀態(tài)的進(jìn)程崩潰時(shí),處于休眠狀態(tài)的進(jìn)程蘇醒并替換崩潰的進(jìn)程執(zhí)行所述解釋型語言的解析方法。
優(yōu)選地,當(dāng)處于工作狀態(tài)的進(jìn)程崩潰時(shí),清理崩潰的所述進(jìn)程的資源。
優(yōu)選地,當(dāng)處于工作狀態(tài)的進(jìn)程崩潰時(shí),建立新的處于休眠狀態(tài)的進(jìn)程,并與蘇醒的進(jìn)程相互鎖定。
本發(fā)明方案通過兩個(gè)相互鎖定的進(jìn)程,來實(shí)現(xiàn)解析方法不會(huì)崩潰的效果。
本發(fā)明還提供一種解釋型語言的解析裝置,其特點(diǎn)是,所述解釋型語言的解析裝置包括:
編輯器接口、語法增強(qiáng)單元、代碼轉(zhuǎn)換單元以及解析器;
其中所述語法增強(qiáng)單元將編輯器接口獲取代碼的每個(gè)最小詞法單元增加標(biāo)簽;
所述編輯器接口獲取到觸發(fā)通知時(shí),所述代碼轉(zhuǎn)換單元基于代碼中標(biāo)簽將代碼轉(zhuǎn)化為多叉樹;
所述解析器逆序遞歸遍歷所述多叉樹。
較佳地,所述解釋型語言的解析裝置還包括散列計(jì)算單元,所述散列計(jì)算單元計(jì)算所述代碼轉(zhuǎn)換單元轉(zhuǎn)化得到的多叉樹的散列結(jié)果;
所述解析器在所述散列結(jié)果與存儲的上次解析散列結(jié)果不相同時(shí),逆序遞歸遍歷所述多叉樹;
更新所述散列結(jié)果作為上次解析散列結(jié)果。
優(yōu)選地,所述散列計(jì)算單元通過MD5或SHA散列算法計(jì)算散列結(jié)果。
本發(fā)明還提供一種計(jì)算機(jī)系統(tǒng),所述計(jì)算機(jī)系統(tǒng)包括兩個(gè)進(jìn)程,所述兩個(gè)進(jìn)程均調(diào)用如上所述的解釋型語言的解析裝置或解釋型語言的解析方法;
其中兩個(gè)進(jìn)程相互鎖定,并且一個(gè)進(jìn)程處于工作狀態(tài),另一個(gè)進(jìn)程處于休眠狀態(tài)。
較佳地,當(dāng)處于工作狀態(tài)的進(jìn)程崩潰時(shí),處于休眠狀態(tài)的進(jìn)程蘇醒并替換崩潰的進(jìn)程執(zhí)行所述解釋型語言的解析方法。
優(yōu)選地,當(dāng)處于工作狀態(tài)的進(jìn)程崩潰時(shí),清理崩潰的所述進(jìn)程的資源。
優(yōu)選地,當(dāng)處于工作狀態(tài)的進(jìn)程崩潰時(shí),建立新的處于休眠狀態(tài)的進(jìn)程,并與蘇醒的進(jìn)程相互鎖定。
在符合本領(lǐng)域常識的基礎(chǔ)上,上述各優(yōu)選條件,可任意組合,即得本發(fā)明各較佳實(shí)例。
本發(fā)明的積極進(jìn)步效果在于:
本發(fā)明通過對最小語法單元增加標(biāo)簽對代碼的語法進(jìn)行增強(qiáng),進(jìn)而能夠?qū)⒋a轉(zhuǎn)換為多叉樹的形式,因而不依賴其他語言和工具,并實(shí)現(xiàn)對解釋型語言的通用、自解析和增量的解釋和執(zhí)行。本發(fā)明還通過兩個(gè)進(jìn)程之間的相互鎖定,實(shí)現(xiàn)了解析方法不會(huì)崩潰的效果。
附圖說明
圖1為本發(fā)明的實(shí)施例1的解釋型語言的解析裝置的結(jié)構(gòu)示意圖。
圖2為本發(fā)明的實(shí)施例1的解析后的詞法樹示意圖。
圖3為本發(fā)明的實(shí)施例1的遞歸過程示意圖。
具體實(shí)施方式
下面通過實(shí)施例的方式進(jìn)一步說明本發(fā)明,但并不因此將本發(fā)明限制在所述的實(shí)施例范圍之中。
本發(fā)明為了實(shí)現(xiàn)在語言解析過程中,不依賴其他語言和工具,就能夠通用、自解析和增量的解釋和執(zhí)行解釋型語言。對輸入代碼的最小語法單元增加標(biāo)簽對代碼的語法進(jìn)行增強(qiáng),進(jìn)而能夠?qū)⒋a轉(zhuǎn)換為多叉樹的形式,并結(jié)合觸發(fā)通知和多叉樹的散列結(jié)果計(jì)算實(shí)現(xiàn)了代碼的即時(shí)、增量地解釋和執(zhí)行的同時(shí),還減少了重復(fù)代碼的重復(fù)解析,節(jié)省了資源。
并且本發(fā)明利用兩個(gè)進(jìn)程執(zhí)行語言解析,避免了單個(gè)進(jìn)程崩潰導(dǎo)致的解析中止,實(shí)現(xiàn)了不崩潰的語言解析的效果。
下面通過下述實(shí)施例來對本發(fā)明進(jìn)行進(jìn)一步地詳細(xì)地說明。
實(shí)施例1
如圖1所示,本實(shí)施例的解釋型語言的解析裝置包括編輯器接口1、語法增強(qiáng)單元11、代碼轉(zhuǎn)換單元2、散列計(jì)算單元21以及解析器3,其中語法增強(qiáng)單元集成于編輯器接口1中,所述散列計(jì)算單元21集成于代碼轉(zhuǎn)換單元2中。
本實(shí)施例中編輯器接口1用于獲取代碼P,語法增強(qiáng)單元11用于將代碼P中每個(gè)最小詞法單元增加標(biāo)簽符號“()”,其中標(biāo)簽可以采用任意的符號,只要能夠標(biāo)識最小語法單元即可,并不限制于本實(shí)施例所選取的符號。
編輯器接口1獲取到觸發(fā)通知時(shí),代碼轉(zhuǎn)換單元2按照標(biāo)簽符號“()”將代碼P轉(zhuǎn)化為多叉樹A。其中本實(shí)施例的觸發(fā)通知是回車或者換行,此外可以根據(jù)代碼的特點(diǎn)采用任意的符號來標(biāo)識,代碼數(shù)據(jù)完畢可以進(jìn)行后續(xù)解釋和執(zhí)行,并不僅限于本實(shí)施例中使用的特定符號。
解析器3用于逆序遞歸遍歷所述多叉樹A。此外散列計(jì)算單元21通過MD5算法計(jì)算多叉樹A的散列結(jié)果H,所述解析器3在散列結(jié)果H與存儲的上一次解析代碼過程中獲得的散列結(jié)果H’不同時(shí),逆序遞歸遍歷所述多叉樹A,并同步更新散列結(jié)果H’。
否則,多叉樹A所對應(yīng)的代碼P已經(jīng)解析執(zhí)行過,因此只需要反饋上一次解析執(zhí)行的結(jié)果,不需要再次解析執(zhí)行代碼P。
其中本實(shí)施例的散列計(jì)算單元21可以采用SHA算法等通用散列算法計(jì)算散列結(jié)果,并不僅局限于MD5算法。
舉例來說,本實(shí)施例的解釋型語言的解析流程如下:
步驟S1、編輯器接口1獲取的代碼P。
步驟S2、語法增強(qiáng)單元11進(jìn)行代碼P的語法增強(qiáng),增加標(biāo)簽由“()”組成,標(biāo)簽自身不參與代碼P的語法部分,對輸入的代碼P所使用的解釋型語言的最小詞法單元,在開始和結(jié)束的地方加上標(biāo)簽“()”。
步驟S3、編輯器接口1檢測到觸發(fā)通知(回車和換行)時(shí),代碼轉(zhuǎn)換單元2將代碼P到數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換,由被解析的語言提供語法解析,對代碼P分解出語法樹,然后再轉(zhuǎn)化為通用的多叉樹A,
也就是說,在用戶輸入代碼時(shí),對于函數(shù)或者數(shù)據(jù)結(jié)構(gòu)的開始和結(jié)束分別插入標(biāo)簽“()”,輸入一定量的代碼后,遇到回車和換行,代碼的文本內(nèi)容就交由代碼轉(zhuǎn)換單元2處理。
代碼轉(zhuǎn)換單元2的轉(zhuǎn)化過程是將由標(biāo)簽“()”組成的代碼P,分解為不含標(biāo)簽“()”的多叉樹A,多叉樹A的每個(gè)節(jié)點(diǎn),其頂部(root)代表執(zhí)行的指令,其葉子節(jié)點(diǎn)代表指令的參數(shù)。由于標(biāo)簽“()”所標(biāo)記的內(nèi)容包含數(shù)據(jù)和函數(shù)兩種情況,所以轉(zhuǎn)換后的多叉樹A也包含兩種節(jié)點(diǎn),但是其性質(zhì)是一致的。例如,對于數(shù)據(jù)的情況,其結(jié)果表示為列表類型的數(shù)據(jù);對于函數(shù)的情況,其結(jié)果是函數(shù)執(zhí)行的返回值,其結(jié)果要么為空列表,要么為包含結(jié)果為列表類型的數(shù)據(jù)。所以代碼P的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換最終總是會(huì)得到列表類型的數(shù)據(jù)。
步驟S4、散列計(jì)算單元21計(jì)算多叉樹A的散列結(jié)果H,當(dāng)所述散列結(jié)果H與存儲的上次解析散列結(jié)果H’不相同時(shí),解析器3逆序遞歸遍歷所述多叉樹A,并存儲所述散列結(jié)果H作為上次解析散列結(jié)果H’。
具體地說,對于代碼轉(zhuǎn)換單元2的轉(zhuǎn)換結(jié)果,其表示為多叉樹A,本實(shí)施例中可以對其二進(jìn)制表示進(jìn)行散列計(jì)算,從而判斷是否需要解析執(zhí)行。如果散列結(jié)果H與上次解析散列結(jié)果H’一致,代表用戶輸入的代碼P與上次輸入的代碼的解析結(jié)果一致,則不需要解析執(zhí)行,否則就需要解析器3進(jìn)行解析執(zhí)行。
其中解析器3逆序遞歸遍歷所述多叉樹A的具體過程如下:
從多叉樹A的葉子節(jié)點(diǎn)開始逆序遍歷,其中多叉樹A的每個(gè)節(jié)點(diǎn)要么本來就是是列表形式的數(shù)據(jù),要么是執(zhí)行結(jié)果為列表形式的數(shù)據(jù)。所以每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都是列表形式的,例如表現(xiàn)為“(開始,)結(jié)束”,“(”之后的第一個(gè)字符可以是操作符,其他位置只能是數(shù)據(jù)或列表。在將整棵多叉樹A按上述方式逆序遞歸其每個(gè)節(jié)點(diǎn),得到的頂端(root)節(jié)點(diǎn)的值就是代表整個(gè)多叉樹A的列表類型的數(shù)據(jù)。由于解析器3的解析過程是共同、通用的,所以可適用于所有的解釋型語言,列表類數(shù)據(jù)結(jié)構(gòu)的最簡單的數(shù)據(jù)結(jié)構(gòu)是list,并且list數(shù)據(jù)結(jié)構(gòu)本身也是通用的。以Javascript(一種編程語言)為例,其列表形式為[1 2 3],實(shí)現(xiàn)方式是數(shù)組。
例如,對于Javascript代碼:
的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化和解析過程如下:
通過js語法解析,只保留body部分,去掉VariableDeclarator,并且對于body中的節(jié)點(diǎn)1,其中引用的m,用節(jié)點(diǎn)0的VariableDeclarator對應(yīng)的m來替代,得到:
然后,對于第一層構(gòu)造,得知其是使用方法concat調(diào)用,前兩個(gè)參數(shù)是1,2,第三參數(shù)是表達(dá)式。對于concat方法,解釋為列表中的同級元素,在同一層即可,對于第三參數(shù),表達(dá)式的語法為+操作的參數(shù)有三個(gè),分別為3、“-”操作符作用于5,6的結(jié)果、“*”操作符作用于3,2的結(jié)果。
所以,解析器的結(jié)果如下(concat為列表合并,在解析器中,就表現(xiàn)為列表的兩個(gè)部分):
其解析后的詞法樹如圖2所示,由(1 2(+3(-5 6)(*3 2)))轉(zhuǎn)為2831203220282B203320282D3520362920282A20332032292929,這個(gè)二進(jìn)制的存儲形式,經(jīng)過MD5散列后的base64編碼為ImzEvNIoL3cX4lph+CDhWA==。
遞歸的過程圖3所示,結(jié)果等于(1 2(3+(-1)+6),即列表型的結(jié)果即為(1 2 8),也就是包含3個(gè)元素的列表。
步驟S5、編輯器接口1輸出解析執(zhí)行的結(jié)果。
此后當(dāng)下一次用戶輸入的回車換行時(shí),重復(fù)上述步驟,再次得出多叉樹的散列結(jié)果,并與上一次的散列結(jié)果做對比,如果一致則放棄解析執(zhí)行,直接輸出上一次的解析執(zhí)行結(jié)果,如果不一致則保存新的散列結(jié)果值,并解析執(zhí)行后返回給編輯器接口1。
實(shí)施例2
本實(shí)施例的計(jì)算機(jī)系統(tǒng)包括兩個(gè)進(jìn)程A、B,所述兩個(gè)進(jìn)程A、B均調(diào)用實(shí)施例1中所述的解釋型語言的解析流程。
本實(shí)施例中兩個(gè)進(jìn)程A、B相互鎖定,并且進(jìn)程A處于工作狀態(tài),進(jìn)程B處于休眠狀態(tài)。如果進(jìn)程A崩潰,進(jìn)程B就會(huì)蘇醒并替換崩潰的進(jìn)程A執(zhí)行所述解釋型語言的解析流程。
與此同時(shí),系統(tǒng)會(huì)自動(dòng)清理崩潰的進(jìn)程A的資源,并建立新的處于休眠狀態(tài)的進(jìn)程C,并與進(jìn)程B相互鎖定。
也就是說,這一對互相鎖定的進(jìn)程。一個(gè)負(fù)責(zé)執(zhí)行,一個(gè)負(fù)責(zé)監(jiān)控(睡眠時(shí)被喚醒),當(dāng)工作的進(jìn)程崩潰的時(shí)候,睡眠的進(jìn)程馬上替換它,并清理不必要的資源,同時(shí)開啟一個(gè)新的進(jìn)程,使其處于睡眠狀態(tài)以替換奔潰的進(jìn)程。以此來達(dá)到不會(huì)崩潰的效果。
例如進(jìn)程1進(jìn)行常規(guī)工作,進(jìn)程2監(jiān)視進(jìn)程1,當(dāng)進(jìn)程1崩潰,進(jìn)程2回收其相關(guān)的資源,然后結(jié)束進(jìn)程1,進(jìn)程2開啟一個(gè)新的監(jiān)視進(jìn)程3監(jiān)控自己,然后開始進(jìn)行進(jìn)程1的常規(guī)工作。
通過以上的解釋型語言的解析方法以其裝置的具體實(shí)施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請的解釋型語言的解析流程可借助軟件加必需的通用硬件平臺的方式來實(shí)現(xiàn)?;谶@樣的理解,本申請的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,所述計(jì)算機(jī)軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如ROM/RAM(只讀存儲器/隨機(jī)存取存儲器)、磁碟、光盤等,包括若干指令用以使得一臺計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請實(shí)施例或者實(shí)施例的某些部分所述的方法。
本申請可用于眾多通用或?qū)S玫挠?jì)算系統(tǒng)環(huán)境或配置中。例如:個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC(個(gè)人電腦)、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。
本申請可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請,在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲介質(zhì)中。
雖然以上描述了本發(fā)明的具體實(shí)施方式,但是本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,這些僅是舉例說明,本發(fā)明的保護(hù)范圍是由所附權(quán)利要求書限定的。本領(lǐng)域的技術(shù)人員在不背離本發(fā)明的原理和實(shí)質(zhì)的前提下,可以對這些實(shí)施方式做出多種變更或修改,但這些變更和修改均落入本發(fā)明的保護(hù)范圍。