編譯計算機語言的方法和裝置與流程
2023-05-23 07:04:26 1
本發明涉及計算機技術應用領域,具體而言,涉及一種編譯計算機語言的方法和裝置。
背景技術:
::隨著計算機語言的廣泛運用,計算機語言的編譯成為了計算機語言在使用過程中不可或缺的關鍵步驟,由於人工編寫的計算機語言存在主觀性,在計算機語言的語法上會出現初始的語法錯誤,因此如何高效正確的對人工編寫的計算機語言進行編譯成為了本領域技術人員需要解決的問題。對計算機語言進行分析,編譯,使其從人容易理解的語言變成計算機容易理解的語言,該編譯基本過程是將源碼變成認證token序列,然後根據定義的語法grammer變成語法分析樹(parsetree,簡稱pst),再經過語義分析變成抽象語法樹(abstractsyntaxtree,簡稱ast),這樣得到的ast就可以被計算機理解了。但是問題在於,由於被分析編譯的源碼由工程人員輸入,經常有各種錯誤。對於簡單的token,例如使用了不該使用的字符,現有編譯器大部分可以在生成pst階段可以一定程度的容忍錯誤,儘量多的編譯剩餘的源碼以便發現更多錯誤。但是如果出錯的地方使其無法轉換成對應的ast,因為ast是一個樹形的嵌套結構,父節點依賴於所有字節點的正確生成,則會導致整個ast生成階段無法進行。ast無法生成會導致依賴ast的功能無法使用,例如在編譯中很多提示類型錯誤,在集成開發環境(integrateddevelopmentenvironment,簡稱ide)中的提示用戶可能用到的函數等。現有技術中對所解析的語言的每一個語法單元進行特殊處理,判斷其是否可以被允許進入更進一步的分析。但是工作量大,現實中對於一種計算機語言難以完整實現。依據上述提到的方法儘量生成ast,但是因為工作量太大且容易出錯所以現實中難以實現。針對上述由於現有技術中缺少對計算機語言進行容錯編譯的技術,導致的計算機語言編譯效率低的問題,目前尚未提出有效的解決方案。技術實現要素:本發明實施例提供了一種編譯計算機語言的方法和裝置,以至少解決由於現有技術中缺少對計算機語言進行容錯編譯的技術,導致的計算機語言編譯效率低的技術問題。根據本發明實施例的一個方面,提供了一種編譯計算機語言的方法,包括:依據預設語法檢測待編譯語句是否存在錯誤的語法單元;在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;在判斷結果為是的情況下,刪除語法單元。根據本發明實施例的另一方面,還提供了一種編譯計算機語言的裝置,包括:檢測模塊,用於依據預設語法檢測待編譯語句是否存在錯誤的語法單元;判斷模塊,用於在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;第一執行模塊,用於在判斷結果為是的情況下,刪除語法單元。在本發明實施例中,通過依據預設語法檢測待編譯語句是否存在錯誤的語法單元;在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;在判斷結果為是的情況下,刪除語法單元,達到了在計算機語言存在多出錯誤的同時提升編譯成功率的目的,從而實現了提升編譯效率的技術效果,進而解決了由於現有技術中缺少對計算機語言進行容錯編譯的技術,導致的計算機語言編譯效率低的技術問題。附圖說明此處所說明的附圖用來提供對本發明的進一步理解,構成本申請的一部分,本發明的示意性實施例及其說明用於解釋本發明,並不構成對本發明的不當限定。在附圖中:圖1是本發明實施例的一種編譯計算機語言的方法的計算機終端的硬體結構框圖;圖2是根據本發明實施例一的編譯計算機語言的方法的流程圖;圖3是根據本發明實施例一的簡化的sql中的select語句的目標ast樹的結構示意圖;圖4是根據本發明實施例一的一種編譯計算機語言的方法的流程圖;圖5是根據本發明實施例一的另一種編譯計算機語言的方法的流程圖;圖6是根據本發明實施例一的又一種編譯計算機語言的方法的流程圖;圖7是根據本發明實施例二的編譯計算機語言的裝置的結構示意圖;圖8是根據本發明實施例二的一種編譯計算機語言的裝置的結構示意圖;圖9是根據本發明實施例二的另一種編譯計算機語言的裝置的結構示意圖;圖10是根據本發明實施例二的又一種編譯計算機語言的裝置的結構示意圖;圖11是根據本發明實施例二的再一種編譯計算機語言的裝置的結構示意圖;圖12是根據本發明實施例二的一種編譯計算機語言的裝置中第二執行模塊的結構示意圖。具體實施方式為了使本
技術領域:
:的人員更好地理解本發明方案,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分的實施例,而不是全部的實施例。基於本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都應當屬於本發明保護的範圍。需要說明的是,本發明的說明書和權利要求書及上述附圖中的術語「第一」、「第二」等是用於區別類似的對象,而不必用於描述特定的順序或先後次序。應該理解這樣使用的數據在適當情況下可以互換,以便這裡描述的本發明的實施例能夠以除了在這裡圖示或描述的那些以外的順序實施。此外,術語「包括」和「具有」以及他們的任何變形,意圖在於覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統、產品或設備不必限於清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或對於這些過程、方法、產品或設備固有的其它步驟或單元。本申請實施例涉及的技術名詞:語法分析樹:parsetree,簡稱pst;抽象語法樹:abstractsyntaxtree,簡稱ast。實施例1根據本發明實施例,還提供了一種編譯計算機語言的方法實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執行指令的計算機系統中執行, 並且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同於此處的順序執行所示出或描述的步驟。本申請實施例一所提供的方法實施例可以在移動終端、計算機終端或者類似的運算裝置中執行。以運行在計算機終端上為例,圖1是本發明實施例的一種編譯計算機語言的方法的計算機終端的硬體結構框圖。如圖1所示,計算機終端10可以包括一個或多個(圖中僅示出一個)處理器102(處理器102可以包括但不限於微處理器mcu或可編程邏輯器件fpga等的處理裝置)、用於存儲數據的存儲器104、以及用於通信功能的傳輸模塊106。本領域普通技術人員可以理解,圖1所示的結構僅為示意,其並不對上述電子裝置的結構造成限定。例如,計算機終端10還可包括比圖1中所示更多或者更少的組件,或者具有與圖1所示不同的配置。存儲器104可用於存儲應用軟體的軟體程序以及模塊,如本發明實施例中的編譯計算機語言的方法對應的程序指令/模塊,處理器102通過運行存儲在存儲器104內的軟體程序以及模塊,從而執行各種功能應用以及數據處理,即實現上述的應用程式的漏洞檢測方法。存儲器104可包括高速隨機存儲器,還可包括非易失性存儲器,如一個或者多個磁性存儲裝置、快閃記憶體、或者其他非易失性固態存儲器。在一些實例中,存儲器104可進一步包括相對於處理器102遠程設置的存儲器,這些遠程存儲器可以通過網絡連接至計算機終端10。上述網絡的實例包括但不限於網際網路、企業內部網、區域網、移動通信網及其組合。傳輸裝置106用於經由一個網絡接收或者發送數據。上述的網絡具體實例可包括計算機終端10的通信供應商提供的無線網絡。在一個實例中,傳輸裝置106包括一個網絡適配器(networkinterfacecontroller,nic),其可通過基站與其他網絡設備相連從而可與網際網路進行通訊。在一個實例中,傳輸裝置106可以為射頻(radiofrequency,rf)模塊,其用於通過無線方式與網際網路進行通訊。在上述運行環境下,本申請提供了如圖2所示的編譯計算機語言的方法。圖2是根據本發明實施例一的編譯計算機語言的方法的流程圖。步驟s202,依據預設語法檢測待編譯語句是否存在錯誤的語法單元;本申請上述步驟s202中,本申請實施例提供的編譯計算機語言的方法可以適用於將源碼變成token序列,然後根據定義的語法grammer變成pst,再經過語義分析變成ast的計算機語言編譯過程。為了規避現有技術問題中由於一旦pst對應的地方無法轉換成ast,會導致整個ast生成階段無法進行,ast無法生成會導致依賴ast的功能無法使用的問題發生。本申請實施例提供的編譯計算機語言的方法中在實現計 算機語言編譯的過程中,首先,遍歷pst計算機語言中是否存在有錯誤的語法單元。具體的,假設一條待編譯語句,「selectuserid,usernamefromusertwhereuserage>20」,根據預設語法,一條待編譯語句中需要包含「select」,「from」和/或「where」部分,由上述提供的待編譯語句可知,select」,「from」和「where」中的語義清楚,並且不存在符號錯誤,且存在語序邏輯,所以在檢測待編譯語句的過程中,若「select」,「from」和/或「where」沒有語法錯誤,則認為可以生成完整正確的ast,其中,需要說明的是「select」,「from」和/或「where」即,本申請實施例提供的語法單元。步驟s204,在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;基於步驟s202的檢測,本申請上述步驟s204中,在檢測結果為待編譯語句存在錯誤的語法單元的情況下,先判斷該語法單元所在的子節點是否為對應的父節點中的可選節點。其中,基於步驟s202中提到的ast,由於ast是一個樹形的嵌套結構,父節點依賴於所有字節點的正確生成,並且,在本申請實施例提供的編譯計算機語言的方法中,當可選節點出錯時,可以剔除該可選節點對應的語法單元,保障必選節點的正確編譯,進而保障ast生成的最大正確ast。即,在判斷結果為是的情況下,執行步驟s206;在判斷結果為否的情況下,執行步驟s208。具體的,圖3是根據本發明實施例一的簡化的sql中的select語句的目標ast樹的結構示意圖;如圖3所示,目標ast樹中所有標有『?』後綴的節點在其父節點中是可選的,例如,選擇語句selectstatement必須有選擇子句序列selectclause,來源子句序列fromclause,而where子句序列whereclause不一定有。沒有whereclause時候selectstatement仍然是正確的,但沒有selectclause和fromclause就不正確,即非法語句。步驟s206,在判斷結果為是的情況下,刪除語法單元;基於步驟s204的判斷結果,本申請上述步驟s206中,在判斷結果為語法單元所在的子節點是對應父節點中的可選節點的情況下,將刪除該語法單元。具體的,仍舊結合步驟s204中的圖3,假設待編譯語句中的from子句序列中來源別名tablealias存在錯誤,在判斷該來源別名tablealias為from子句序列中的可選節點的情況下,刪除該條件表述序列,編譯selectclause和fromclause中剩餘正確的語法單元部分。此外,圖4是根據本發明實施例一的一種編譯計算機語言的方法的流程圖。如圖 4所示,當步驟s202依據預設語法檢測待編譯語句中的語法單元時,即,在檢測結果為否的情況下,編譯該待編譯語句中的語法單元。由上可知,本申請上述實施例一所提供的方案,通過依據預設語法檢測待編譯語句是否存在錯誤的語法單元;在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;在判斷結果為是的情況下,刪除語法單元,達到了在計算機語言存在多出錯誤的同時提升編譯成功率的目的,從而實現了提升編譯效率的技術效果,進而解決了由於現有技術中缺少對計算機語言進行容錯編譯的技術,導致的計算機語言編譯效率低的技術問題。可選的,圖5是根據本發明實施例一的另一種編譯計算機語言的方法的流程圖,如圖5所示,在步驟s204判斷語法單元所在的子節點是否為對應的父節點中的可選節點之後,本申請實施例提供的編譯計算機語言的方法還包括:步驟s208,在判斷結果為否的情況下,遞歸查詢父節點是否為對應上一級父節點中的可選節點;基於步驟s204中的判斷結果,本申請上述步驟s208中,在判斷結果為語法單元所在的子節點不是對應父節點中的可選節點的情況下,即,該語法單元所在的子節點為對應父節點中的必選節點,將遞歸查詢該語法單元所在的子節點對應的父節點是否為該父節點中的可選節點。具體的,仍舊結合步驟s204中的圖3,假設待編譯語句中的where子句序列中的條件表述序列存在錯誤,如圖3所示,該條件表述序列condition不是wherecondition中的可選節點,此時需要查詢繼續查看wherecondition的父節點wherecluase是否為可選節點,如圖3所示,wherecondition在wherecluase中仍然不是可選節點,將查詢wherecluase是否為父節點selectstatement中的可選節點。其中,如圖3所示,在本申請實施例提供的編譯計算機語言的方法中,遞歸查詢父節點是否為對應上一級父節點中的可選節點的方式具體如下:方式一,查詢該語法單元所在的子節點為對應父節點的上一級節點,層層遞進查詢;假設當前待編譯語句為「selectuserid,usernamefromusertwhereuserage*20」。由此可見,whereclause中的expression存在錯誤,即,「userage*20」中的「*」為圖3中不可識別標識符。因此,如圖3所示,expression的父節點為condition,由於該condition為必選節點,因此繼續查詢該condition的父節點whereclause。方式二,查詢該語法單元所在的子節點為對應父節點所屬分類,查詢分類節點處的節點類型。仍舊以方式一中的舉例為例,若whereclause中的expression存在錯誤,則由於expression為whereclause中的語法單元,所以直接查詢expression所屬的whereclause是否為可選節點。結合方式一和方式二,本申請實施例提供的編譯計算機語言的方法中以方式一的實現方式為優選方式為例進行說明,以實現本申請實施例提供的編譯計算機語言的方法為準,具體不做限定。步驟s210,在查詢結果為是的情況下,刪除父節點對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。基於步驟s208中遞歸查詢父節點是否為對應父節點中的可選節點,本申請上述步驟s210中,在查詢結果為該父節點對應的父節點中的可選節點時,刪除該父節點對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。具體的,仍舊以步驟s208中的示例為例,在查詢得到wherecluase是為父節點selectstatement中的可選節點的情況下,將整個對應whereclause的部分裁減,其他部分仍然可以生成selectstatement的合法ast,只是不包含有錯的whereclause,仍然可以用來支持後續所有基於ast的功能。本申請實施例可以根據語法結構中對於一個ast節點在其父節點中是否是可選的信息,自動的對有錯誤的pst節點進行裁減,使所有能夠生成正確ast的pst還能夠生成ast,所有會導致錯誤ast的節點都被忽略。生成的ast剛好是能夠生成的最大正確ast,仍然能夠最大的支持基於ast的應用。節點在其父節點中是否可選可以從要分析的計算機語言的語法定義中自動取得,一般的語法定義和編譯代碼生成器,例如yacc,antlr,jflex等,都可以直接或間接提供此功能。可選的,待編譯語句中的語法單元包括:選擇子句序列和來源子句序列,其中,選擇子句序列包括:選擇列表,選擇列表中任意一列均為選擇列表中的可選節點;來源子句序列包括:來源表名和/或來源別名,來源別名為來源子句序列中的可選節點。可選的,在錯誤的語法單元為選擇子句序列中的選擇列表的情況下,步驟s204中判斷語法單元所在的子節點是否為對應的父節點中的可選節點包括:step1,判斷選擇列表中的每一列是否均存在語法錯誤;本申請上述步驟s204中的step1中,在待編譯語句中的選擇子句序列中的選擇列表存在錯誤的情況下,判斷該選擇列表中的每一列是否均存在語法錯誤。具體的,結合圖3所示,在選擇列表中每一列column1…columnn都是可選的,因此需要判斷該選擇列表中的每一列是否都存在語法錯誤。在判斷結果為是的情況下,執行步驟step4,在判斷結果為否的情況下,執行步驟step2和step3。step2,在判斷結果為否的情況下,判斷選擇列表中的至少一列是否存在語法錯誤;基於step1中的判斷,本申請上述步驟step2中,在判斷結果為選擇列表中的每一列並不全部存在語法錯誤的情況下,需要判斷該選擇列表中的至少一列是否存在語法錯誤。具體的,結合圖3,在假設選擇子句序列selectcluase中的選擇列表selectlist中並不是每一列都存在語法錯誤的情況下,需要判斷選擇列表selectlist中存在語法錯誤的列的個數。step3,在判斷結果為選擇列表中的至少一列存在語法錯誤的情況下,判斷選擇列表是否為選擇子句序列中的可選節點;基於step2中的判斷,本申請上述步驟step3中,在判斷結果為選擇列表中的至少一列存在語法錯誤的情況下,判斷選擇列表是否為選擇子句序列中的可選節點。具體的,結合圖3,如圖3所示,在判斷結果為選擇列表中的至少一列存在語法錯誤的情況下,判斷選擇列表selectlist是否為選擇子句序列selectcluase中的可選節點。step4,在判斷結果為選擇列表中的每一列均存在語法錯誤的情況下,判定待編譯語句為非法語句。本申請上述步驟step4中,在判斷結果為選擇列表中的每一列均存在語法錯誤的情況下,如果所有列column都有錯,會導致整個selectstatement都無法正確生成,但也是預期的結果,因為沒有選擇列表的select語句就是不合法的。可選的,圖6是根據本發明實施例一的又一種編譯計算機語言的方法的流程圖,如圖6所示,在步驟s208中遞歸查詢父節點是否為對應上一級父節點中的可選節點之後,本申請實施例提供的編譯計算機語言的方法還包括:步驟s209,在查詢結果為選擇列表為選擇子句序列中的必選節點的情況下,編譯 選擇列表中語法正確的列。本申請上述步驟s209中,在選擇子句序列中存在錯誤的語法單元的情況下,基於步驟s208遞歸查詢父節點是否為對應父節點中的可選節點之後,在查詢結果為選擇列表為選擇子句序列中的必選節點的情況下,編譯選擇列表中語法正確的列。具體的,仍舊以上述步驟s204中的示例為例,假設選擇列表selectlist中存在錯誤的列column,則遞歸查詢該column的父節點selectlist是否為可選節點,在查詢結果為父節點selectlist為父節點selectcluase中的必選結果的情況下,編譯selectlist中語法正確的列。可選的,在錯誤的語法單元為來源子句序列中的來源別名的情況下,步驟s204中判斷語法單元所在的子節點是否為對應的父節點中的可選節點包括:step1,判斷來源別名是否為來源子句序列中的可選節點。本申請上述步驟s204中的step1中,在錯誤的語法單元為來源子句序列中的來源別名的情況下,需判斷該來源別名是否為來源子句序列中的可選節點。進一步地,可選的,步驟s206中在判斷結果為是的情況下,刪除語法單元包括:step1,在判斷結果為來源別名是來源子句序列中的可選節點的情況下,刪除來源別名對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。基於上述步驟s204的判斷,本申請上述步驟s206中的step1中,在判斷結果為來源別名是來源子句序列中的可選節點的情況下,刪除來源別名對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。具體的,如圖3所示,該來源別名tablealias為可選節點,因此刪除該來源節點對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。即,假設「selectuserid,usernamefromuser『@#$%』whereuserage>20」;語句中對應alias的節點『@#$%』是個非法節點,無法被翻譯成正常的aliasast。此時查看alias確定其在父節點,也就是table中,是可選節點。則不生成aliasast,父節點table中包含值為』user』的tablename節點,仍然是個合法的ast。語句中其他部分沒有任何問題,生成的完整ast樹種除了沒有table的alias,仍然可以用來支持後續所有基於ast的功能。可選的,待編譯語句中的語法單元還包括:第一子句序列,其中,第一子句序列包括:條件表述序列;第一子句序列為待編譯語句中的可選節點,條件表述序列為第一子句序列的必選節點。進一步地,可選的,在待編譯語句中條件表述序列中的表述條件錯誤的情況下,步驟s208中遞歸查詢父節點是否為對應父節點中的可選節點包括:step1,查詢條件表述序列是否為第一子句序列中的可選節點;本申請上述步驟s208中的step1中,在待編譯語句中條件表述序列中的表述條件錯誤的情況下,需要查詢該條件表述序列所在的子節點是否為第一子句序列中的可選節點,在查詢結果為否的情況下執行步驟step2。step2,在查詢結果為否的情況下,查詢第一子句序列是否為待編譯語句中的可選節點。基於step1中的查詢,本申請上述步驟step2中,在查詢結果為該條件表述序列不是該第一子句序列中的可選節點的情況下,需要查詢第一子句序列是否為待編譯語句中的可選節點。具體的,結合圖3,假設存在待編譯語句「selectuserid,usernamefromusertwhereuserage*20」;其中,語句中對應condition的節點中關係操作符非法,』*』不是一個可被接受的關係操作符,無法被翻譯成正常的ast。此時查看條件表述序列對應的父節點,也就是condition中,不是可選節點,導致其父節點condition也不能生成ast,查詢condition在條件表述序列wherecondition中是否可選,若是必選節點,則繼續查看條件表述序列wherecondition的父節點第一子句序列wherecluase,查詢該條件表述序列wherecondition在第一子句序列wherecluase中是否為可選節點,在查詢結果為是的情況下,則繼續查看第一子句序列wherecluase在父節點selectstatement中是否為可選節點。進一步地,可選的,步驟s210中刪除父節點對應的語法單元,編譯待編譯語句中剩餘正確的語法單元包括:step1,刪除第一子句序列對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。本申請上述步驟s210中的step1中,在查詢結果為該父節點為該父節點對應父節點中的可選節點的情況下,將刪除該第一子句序列對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。具體的,仍舊以上述步驟s208中的step1和step2中的示例為例,在查詢得到該第一子句序列whereclause為可選節點,則將整個對應whereclause的部分裁減,其他部分仍然可以生成selectstatement的合法ast,只是不包含有錯的whereclause, 仍然可以用來支持後續所有基於ast的功能。結合步驟s202至步驟s210,本申請實施例提供的編譯計算機語言的方法中可以包含三種語法錯誤,具體如下:1.完全正確的輸入源碼:「selectuserid,usernamefromusertwhereuserage>20」;此語句沒有任何問題,可生成完整ast樹。2.錯誤情況一,單一可選節點出錯:「selectuserid,usernamefromuser『@#$%』whereuserage>20」;語句中對應alias的節點『@#$%』是個非法節點,無法被翻譯成正常的aliasast。此時查看alias確定其在父節點,也就是table中,是可選節點。則不生成aliasast,父節點table中包含值為』user』的tablename節點,仍然是個合法的ast。語句中其他部分沒有任何問題,生成的完整ast樹種除了沒有table的alias,仍然可以用來支持後續所有基於ast的功能。3.錯誤情況二,單一不可選節點出錯:「selectuserid,usernamefromusertwhereuserage*20」;語句中對應condition的節點中關係操作符非法,』*』不是一個可被接受的關係操作符,無法被翻譯成正常的ast。此時查看其在父節點,也就是condition中,不是可選節點,導致其父親節點condition也不能生成ast,即使其其他節點都沒有錯誤。此時繼續查看condition在其父節點中是否可選,如果可選則裁減此部分的pst,如果不可選遞歸的查看父節點中是否可選。對於此例,condition在wherecondition中不是可選,而是必須項,所以繼續查看wherecondition的父節點wherecluase,發現wherecondition在wherecluase中仍然不是可選節點,則繼續查看wherecondition的父節點selectstatement,發現可選,則將整個對應whereclause的部分裁減,其他部分仍然可以生成selectstatement的合法ast,只是不包含有錯的whereclause,仍然可以用來支持後續所有基於ast的功能。4.錯誤情況三,一或多個可選循環節點出錯:「selectuserid,user@#ame,userage,&usexxxfromusertwhereuserage>20」;ast中column1…columnn共同組成select列表,其中任何一個都是可選的,但 是最終列表中至少要有一個。此示例語句中對應column2,column4節點中有非法字符,無法被翻譯成column的ast。此時查看其父節點,也就是selectlist中,是否還有其他合法的condition,發現還有column1,column3正確,則裁減有錯的column2,column4,仍然可以包含column1,column3的正確selectlist節點。最後仍然可以生成合法的selectstatement,只是不包含有錯的兩個column,仍然可以用來支持後續所有基於ast的功能。此例中,如果所有column都有錯,按照此例與例三種的規則,會導致整個selectstatement都無法正確生成,但也是預期的結果,因為沒有選擇列表的select語句就是不合法的。綜上,綜上,本申請實施例提供的編譯計算機語言的方法可以應用在對sql語言的編譯器中。也可應用到任何其他計算機語言。本申請實施例提供的編譯計算機語言的方法可以用遞歸的判斷ast在其父節點中是否可選,實現對計算機語言的容錯分析,降低了編譯過程中的工作量,實現對計算機語言的最大化正確編譯。需要說明的是,對於前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本發明並不受所描述的動作順序的限制,因為依據本發明,某些步驟可以採用其他順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬於優選實施例,所涉及的動作和模塊並不一定是本發明所必須的。通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到根據上述實施例的編譯計算機語言的方法可藉助軟體加必需的通用硬體平臺的方式來實現,當然也可以通過硬體,但很多情況下前者是更佳的實施方式。基於這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分可以以軟體產品的形式體現出來,該計算機軟體產品存儲在一個存儲介質(如rom/ram、磁碟、光碟)中,包括若干指令用以使得一臺終端設備(可以是手機,計算機,伺服器,或者網絡設備等)執行本發明各個實施例所述的方法。實施例2根據本發明實施例,還提供了一種用於實施上述方法實施例的裝置實施例,本申請上述實施例所提供的裝置可以在計算機終端上運行。圖7是根據本發明實施例二的編譯計算機語言的裝置的結構示意圖。如圖7所示,該編譯計算機語言的裝置可以包括:檢測模塊71、判斷模塊72、第一執行模塊73。其中,檢測模塊71,用於依據預設語法檢測待編譯語句是否存在錯誤的語法單元;判斷模塊72,用於在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;第一執行模塊73,用於在判斷結果為是的情況下,刪除語法單元。由上可知,本申請上述實施例二所提供的方案,通過依據預設語法檢測待編譯語句是否存在錯誤的語法單元;在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;在判斷結果為是的情況下,刪除語法單元,達到了在計算機語言存在多出錯誤的同時提升編譯成功率的目的,從而實現了提升編譯效率的技術效果,進而解決了由於現有技術中缺少對計算機語言進行容錯編譯的技術,導致的計算機語言編譯效率低的技術問題。此處需要說明的是,上述檢測模塊71、判斷模塊72和第一執行模塊73對應於實施例一中的步驟s202至步驟s206,三個模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。可選的,圖8是根據本發明實施例二的一種編譯計算機語言的裝置的結構示意圖,如圖8所示,本申請實施例提供的編譯計算機語言的裝置還包括:查詢模塊74和第二執行模塊75。其中,查詢模塊74,用於在判斷語法單元所在的子節點是否為對應的父節點中的可選節點之後,在判斷結果為否的情況下,遞歸查詢父節點是否為對應上一級父節點中的可選節點;第二執行模塊75,用於在查詢結果為是的情況下,刪除父節點對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。此處需要說明的是,上述查詢模塊74和第二執行模塊75對應於實施例一中的步驟s208和步驟s210,兩個模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。可選的,待編譯語句中的語法單元包括:選擇子句序列和來源子句序列,其中,選擇子句序列包括:選擇列表,選擇列表中任意一列均為選擇列表中的可選節點;來源子句序列包括:來源表名和/或來源別名,來源別名為來源子句序列中的可選節點。可選的,圖9是根據本發明實施例二的另一種編譯計算機語言的裝置的結構示意圖。如圖9所示,判斷模塊72包括:第一判斷單元721、第二判斷單元722、第三判 斷單元723和第四判斷單元724。其中,第一判斷單元721,用於在錯誤的語法單元為選擇子句序列中的選擇列表的情況下,判斷選擇列表中的每一列是否均存在語法錯誤;第二判斷單元722,用於在判斷結果為否的情況下,判斷選擇列表中的至少一列是否存在語法錯誤;第三判斷單元723,用於在判斷結果為選擇列表中的至少一列存在語法錯誤的情況下,判斷選擇列表是否為選擇子句序列中的可選節點;第四判斷單元724,用於在判斷結果為選擇列表中的每一列均存在語法錯誤的情況下,判定待編譯語句為非法語句。此處需要說明的是,上述第一判斷單元721、第二判斷單元722、第三判斷單元723和第四判斷單元724對應於實施例一中的步驟s204中的step1至step4,四個模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。可選的,圖10是根據本發明實施例二的又一種編譯計算機語言的裝置的結構示意圖。如圖10所示,本申請實施例提供的編譯計算機語言的裝置還包括:編譯模塊76。其中,編譯模塊76,用於在遞歸查詢父節點是否為對應上一級父節點中的可選節點之後在查詢結果為選擇列表為選擇子句序列中的必選節點的情況下,編譯選擇列表中語法正確的列。此處需要說明的是,上述編譯模塊76對應於實施例一中的步驟s209,該模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。可選的,判斷模塊72包括:第五判斷單元。其中,第五判斷單元,用於在錯誤的語法單元為來源子句序列中的來源別名的情況下,判斷來源別名是否為來源子句序列中的可選節點。此處需要說明的是,上述第五判斷單元對應於實施例一中的步驟s204中的step1,該模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。可選的,圖11是根據本發明實施例二的再一種編譯計算機語言的裝置的結構示意圖。如圖11所示,第一執行模塊73包括:第一執行單元731。其中,第一執行單元731,用於在判斷結果為來源別名是來源子句序列中的可選節點的情況下,刪除來源別名對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。此處需要說明的是,上述第一執行單元731對應於實施例一中的步驟s206中的step1,該模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。可選的,待編譯語句中的語法單元還包括:第一子句序列,其中,第一子句序列包括:條件表述序列;第一子句序列為待編譯語句中的可選節點,條件表述序列為第一子句序列的必選節點。可選的,查詢模塊74包括:第一查詢單元和第二查詢單元。其中,第一查詢單元,用於在待編譯語句中條件表述序列中的表述條件錯誤的情況下,查詢條件表述序列是否為第一子句序列中的可選節點;第二查詢單元,用於在查詢結果為否的情況下,查詢第一子句序列是否為待編譯語句中的可選節點。此處需要說明的是,上述第一查詢單元和第二查詢單元對應於實施例一中的步驟s208中的step1和step2,兩個模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。進一步地,可選的,圖12是根據本發明實施例二的一種編譯計算機語言的裝置中第二執行模塊的結構示意圖。如圖12所示,第二執行模塊75包括:第二執行單元751。其中,第二執行單元751,用於刪除第一子句序列對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。此處需要說明的是,上述第二執行單元751對應於實施例一中的步驟s210中的step1,該模塊與對應的步驟所實現的示例和應用場景相同,但不限於上述實施例一所公開的內容。需要說明的是,上述模塊作為裝置的一部分可以運行在實施例一提供的計算機終端10中,可以通過軟體實現,也可以通過硬體實現。綜上,本申請實施例提供的編譯計算機語言的方法可以應用在對sql語言的編譯器中。也可應用到任何其他計算機語言。本申請實施例提供的編譯計算機語言的方法可以用遞歸的判斷ast在其父節點中是否可選,實現對計算機語言的容錯分析,降低了編譯過程中的工作量,實現對計算機語言的最大化正確編譯。實施例3本發明的實施例還提供了一種存儲介質。可選地,在本實施例中,上述存儲介質可以用於保存上述實施例一所提供的編譯計算機語言的方法所執行的程序代碼。可選地,在本實施例中,上述存儲介質可以位於計算機網絡中計算機終端群中的任意一個計算機終端中,或者位於移動終端群中的任意一個移動終端中。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:依據預設語法檢測待編譯語句是否存在錯誤的語法單元;在檢測結果為是的情況下,判斷語法單元所在的子節點是否為對應的父節點中的可選節點;在判斷結果為是的情況下,刪除語法單元。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:在判斷結果為否的情況下,遞歸查詢父節點是否為對應上一級父節點中的可選節點;在查詢結果為是的情況下,刪除父節點對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:待編譯語句中的語法單元包括:選擇子句序列和來源子句序列,其中,選擇子句序列包括:選擇列表,選擇列表中任意一列均為選擇列表中的可選節點;來源子句序列包括:來源表名和/或來源別名,來源別名為來源子句序列中的可選節點。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:判斷選擇列表中的每一列是否均存在語法錯誤;在判斷結果為否的情況下,判斷選擇列表中的至少一列是否存在語法錯誤;在判斷結果為選擇列表中的至少一列存在語法錯誤的情況下,判斷選擇列表是否為選擇子句序列中的可選節點;在判斷結果為選擇列表中的每一列均存在語法錯誤的情況下,判定待編譯語句為非法語句。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:在查詢結果為選擇列表為選擇子句序列中的必選節點的情況下,編譯選擇列表中語法正確的列。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:判斷來源別名是否為來源子句序列中的可選節點。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:在判斷結果為來源別名是來源子句序列中的可選節點的情況下,刪除來源別名對應的 語法單元,編譯待編譯語句中剩餘正確的語法單元。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:查詢條件表述序列是否為第一子句序列中的可選節點;在查詢結果為否的情況下,查詢第一子句序列是否為待編譯語句中的可選節點。可選地,在本實施例中,存儲介質被設置為存儲用於執行以下步驟的程序代碼:刪除第一子句序列對應的語法單元,編譯待編譯語句中剩餘正確的語法單元。上述本發明實施例序號僅僅為了描述,不代表實施例的優劣。在本發明的上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。在本申請所提供的幾個實施例中,應該理解到,所揭露的技術內容,可通過其它的方式實現。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特徵可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以採用硬體的形式實現,也可以採用軟體功能單元的形式實現。所述集成的單元如果以軟體功能單元的形式實現並作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中。基於這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟體產品的形式體現出來,該計算機軟體產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可為個人計算機、伺服器或者網絡設備等)執行本發明各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:u盤、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、移動硬碟、磁碟或者光碟等各種可以存儲程序代碼的介質。以上所述僅是本發明的優選實施方式,應當指出,對於本
技術領域:
:的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發明的保護範圍。當前第1頁12當前第1頁12