亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

源代碼解析方法和系統(tǒng)的制作方法

文檔序號:6436466閱讀:302來源:國知局
專利名稱:源代碼解析方法和系統(tǒng)的制作方法
技術(shù)領域
本發(fā)明涉及計算機應用領域,尤其涉及一種源代碼解析方法和系統(tǒng)。
背景技術(shù)
隨著軟件工程的規(guī)模越來越大,源碼文件越來越多,源代碼文件間的調(diào)用關(guān)系也是日趨復雜。單純依靠編譯器不足以發(fā)現(xiàn)代碼中存在的所有問題,越來越多的開發(fā)者使用源代碼靜態(tài)分析器工具作為編譯器的有效補充來發(fā)現(xiàn)和解決程序中可能存在的問題,如語義錯誤、安全缺陷等。一般方法是將源代碼輸入源代碼靜態(tài)分析前端,首先由前端進行處理,將源代碼轉(zhuǎn)換為精簡的中間代碼,然后交給缺陷分析模塊,缺陷分析模塊對中間代碼進行分析從而發(fā)現(xiàn)代碼中存在的缺陷。傳統(tǒng)源代碼分析前端基本流程如下首先進行詞法分析,讀入源代碼字符流,并將其組織為有意義的詞素序列。對于每個詞素,詞法分析器產(chǎn)生如下形式的詞法單元作為輸出〈token-name,attribute_value>其次進行語法分析,使用由詞法分析器生成的各個詞法單元的一個分量創(chuàng)建樹形的中間表示。接著進行語義分析,使用語法樹和符號表中的信息檢查源代碼是否和語言定義的
語義一致。最后創(chuàng)建中間代碼,將語法分析和語義分析的結(jié)果生成語言特性無關(guān)的中間表示形式。針對Perl語言編輯的代碼,由于Perl語言自身的靈活性以及在Perl語言演進過程中存在大量的冗余及復雜語法,對復雜的Perl源代碼文件進行完整的詞法及語法分析工作量很大。傳統(tǒng)的編譯器前端為了降低設計復雜度,往往將詞法分析和語法分析獨立成兩個模塊,詞法分析階段只負責將字符流解析成符號流,供語法分析器使用。詞法分析器的工作涉及讀取源程序、識別詞素、過濾代碼中的注釋和空白、將錯誤信息與源代碼位置關(guān)聯(lián)等等。語法分析器利用上下文無關(guān)文法,構(gòu)造語法推導規(guī)則,生成解析器代碼。由于Perl語言的語法規(guī)則比較靈活,嚴格意義上說Perl語言無法用上下文無關(guān)文法準確描述。因此傳統(tǒng)的編譯器工具無法生成Perl源代碼語法解析工具,沒有辦法生成AST和三地址碼。

發(fā)明內(nèi)容
本發(fā)明提供一種源代碼解析方法和系統(tǒng),要解決的技術(shù)問題是如何使用現(xiàn)有技術(shù)中的語法分析器解析Perl語言的源代碼。為解決上述技術(shù)問題,本發(fā)明提供了如下技術(shù)方案(此處待權(quán)利要求核定后補)與現(xiàn)有技術(shù)相比,在采用語法分析器解析Perl語言之前,通過預處理將Perl源代碼中的詞素進行識別,并標注用戶自定義的詞素進行標注,明確上述用戶自定義的詞素在代碼中的類型,從而將Perl語言中上下文相關(guān)的文法轉(zhuǎn)換成了上下文無關(guān)的文法,從而使得現(xiàn)有技術(shù)中的語法分析器能夠處理,克服了現(xiàn)有技術(shù)中語法分析器無法處理Perl源代碼的問題。


圖1為本發(fā)明提供的源代碼解析方法實施例的流程示意圖;圖2為本發(fā)明提供的源代碼解析系統(tǒng)實施例的結(jié)構(gòu)示意圖。
具體實施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖及具體實施例對本發(fā)明作進一步的詳細描述。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互任意組合。圖1為本發(fā)明提供的源代碼解析方法實施例的流程示意圖。圖1所示方法實施例, 包括步驟11、在采用語法分析器對Perl源代碼進行解析之前,獲取Perl源代碼中的函數(shù)信息和變量信息,其中所述函數(shù)信息包括系統(tǒng)函數(shù)和用戶自定義的函數(shù),所述變量信息包括系統(tǒng)變量以及用戶自定義的包變量和詞法變量;步驟12、為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量分別設置一對應的前綴標識符;步驟13、在對Perl源代碼的解析過程中,如果根據(jù)得到函數(shù)信息和符號信息確定得到的詞素為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量中的一個,在所述詞素之前增加對應的前綴標識符,得到處理后的代碼,將所述處理后的代碼作為語法分析器所要解析的代碼。其中為用戶自定義的函數(shù)所對應的前綴標識符可以為“&”,之所以采用“&”目的在于,在perl語言中“&”被規(guī)定為表示函數(shù)調(diào)用,增加這個前綴標識符,適用于語法分析器的識別習慣;另外,用戶自定義的包變量所對應的前綴標識符可以為“$P”;詞法變量所對應的前綴標識符可以為“ $1 ” ;當然,至于變量的前綴標識符可以由用戶自行定義。其中,得到的詞素為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量中的一個是通過按照下述條件判斷得到的,包括1、得到的詞素為用戶自定義的函數(shù)的條件為該詞素有函數(shù)調(diào)用信息;該詞素不為函數(shù)信息中的系統(tǒng)函數(shù)的表達式。2、得到的詞素為用戶自定義的詞法變量的條件為該詞素為變量信息;該詞素不是變量信息中的系統(tǒng)變量的表達式;該詞素與變量信息中該詞素所在工作域中的一個詞法變量相同。3、得到的詞素為用戶自定義的包變量的條件為該詞素為變量信息;
該詞素與變量信息中系統(tǒng)變量均不同;該詞素與變量信息中該詞素所在工作域中的詞法變量均不同;該詞素與變量信息中該詞素所在工作域中的一個包變量相同。下面對本發(fā)明提供的方法作進一步說明步驟111、采用詞法和語法分析,得到Perl源代碼的系統(tǒng)符號表和用戶符號表,其中系統(tǒng)符號表包括Perl源代碼所使用的系統(tǒng)函數(shù)和系統(tǒng)變量,用戶符號表包括用戶在該 Perl源代碼中自定義的包函數(shù)、包變量以及詞法變量。具體來說,可以細化為如下步驟在接收到Perl源代碼的字符流后,使用正則表達式對接收到的字符流進行函數(shù)定義的匹配,得到匹配結(jié)果;如果匹配結(jié)果為系統(tǒng)函數(shù),則執(zhí)行如下步驟步驟Al、對語句進行劃分。步驟A2、判斷劃分后的語句是否是復合語句;如果是,則執(zhí)行步驟A3 A5 ;否則,表示該語句為簡單語句,則直接執(zhí)行步驟A5。步驟A3、構(gòu)建復合語句的結(jié)構(gòu)。步驟A4、按照得到的結(jié)構(gòu),拆分復合語句為簡單語句。步驟A5、解析簡單語句,得到包變量和詞法變量。如果是用戶函數(shù),則執(zhí)行如下步驟步驟Bi、對用戶自定義的包函數(shù)進行解析,得到包變量和詞法變量。步驟B2、確定各包變量和各詞法變量的作用域;其中,由于上述兩種變量的作用域不同,所以需要確定作用域。步驟B3、在用戶符號表中,基于作用域,建立每個作用域所對應的子符號表,記錄對該作用域有效的包變量和詞法變量。其中所述符號表是針對全部Perl代碼得到的,即記錄有該源代碼中全部的符號 fn息ο步驟112、在解析語句的過程中,如果發(fā)現(xiàn)某詞素可能是一個函數(shù)調(diào)用,則首先檢測該詞素是否是系統(tǒng)函數(shù)。如果不是,則進一步檢測該詞素是否是用戶自定義函數(shù),則在該詞素之前增加對應的前綴標識符,如果一個詞素為變量,如果該變量不是系統(tǒng)變量,則進一步判斷該詞素與步驟111中建立的符號表中該詞素所在工作域中的一個詞法變量相同,則確定該詞素為詞法變量,并增加對應的前綴符號;如果該詞素不是該作用域中變量信息中該詞素所在工作域中的詞法變量,則可以進一步判斷符號表中相同作用域中是否有一個包變量相同,如果有,則確定該詞素為該作用域的包變量,并增加相應的前綴標識符。例如,可以對Perl源代碼進行一定的預處理工作,將某些上下文相關(guān)的語法轉(zhuǎn)換為上下文無關(guān)的語法。如語句$x = max 1,2如果我們檢測符號表的過程中,發(fā)現(xiàn)max不是系統(tǒng)函數(shù),是一個用戶自定義函數(shù), 那么我們可以將這個語句轉(zhuǎn)換為$x = &max(l,2)
前綴“&”可以有效的表明max是一個用戶定義的函數(shù)。步驟113、在消除可能引起歧義的上下文相關(guān)語句后,我們就可以采用成熟的語法分析工具,通過構(gòu)建Perl語言的上下文無關(guān)語法描述,生成Perl語言語法解析器,使用此解析器就可以進一步創(chuàng)建抽象語法樹(AST)和三地址碼表現(xiàn)形式。與現(xiàn)有技術(shù)相比,本發(fā)明方法實施例在采用語法分析器解析Perl語言之前,通過預處理將Perl源代碼中的詞素進行識別,并標注用戶自定義的詞素進行標注,明確上述用戶自定義的詞素在代碼中的類型,從而將Perl語言中上下文相關(guān)的文法轉(zhuǎn)換成了上下文無關(guān)的文法,從而使得現(xiàn)有技術(shù)中的語法分析器能夠處理,克服了現(xiàn)有技術(shù)中語法分析器無法處理Perl源代碼的問題。圖2為本發(fā)明提供的源代碼解析系統(tǒng)實施例的結(jié)構(gòu)示意圖,圖2所示系統(tǒng)實施例, 包括獲取裝置21,采用語法分析器對Perl源代碼進行解析之前,獲取Perl源代碼中的函數(shù)信息和變量信息,其中所述函數(shù)信息包括系統(tǒng)函數(shù)和用戶自定義的函數(shù),所述變量信息包括系統(tǒng)變量以及用戶自定義的包變量和詞法變量;設置裝置22,與所述獲取裝置21相連,為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量分別設置一對應的前綴標識符;處理裝置23,與所述設置裝置22相連,用于在對Perl源代碼的解析過程中,如果根據(jù)得到函數(shù)信息和符號信息確定得到的詞素為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量中的一個,在所述詞素之前增加對應的前綴標識符,得到處理后的代碼,將所述處理后的代碼作為語法分析器所要解析的代碼。優(yōu)選的,所述設置裝置所設置的用戶自定義的函數(shù)對應的前綴標識符為“&”。其中,所述系統(tǒng)還包括第一識別裝置,用于在得到的詞素滿足如下全部條件時,識別該詞素為為用戶自定義的函數(shù),其中所述條件包括該詞素有函數(shù)調(diào)用信息;該詞素不為函數(shù)信息中的系統(tǒng)函數(shù)的表達式。其中,所述系統(tǒng)還包括第二識別裝置,用于在得到的詞素滿足如下全部條件時,識別該詞素為用戶自定義的詞法變量,其中所述條件包括該詞素為變量信息;該詞素不是變量信息中的系統(tǒng)變量的表達式;該詞素與變量信息中該詞素所在工作域中的一個詞法變量相同。其中,所述系統(tǒng)還包括第三識別裝置,用于在得到的詞素滿足如下全部條件時,識別該詞素為用戶自定義的包變量,其中所述條件包括該詞素為變量信息;該詞素與變量信息中系統(tǒng)變量均不同;該詞素與變量信息中該詞素所在工作域中的詞法變量均不同;該詞素與變量信息中該詞素所在工作域中的一個包變量相同。
7
與現(xiàn)有技術(shù)相比,本發(fā)明系統(tǒng)實施例在采用語法分析器解析Perl語言之前,通過預處理將Perl源代碼中的詞素進行識別,并標注用戶自定義的詞素進行標注,明確上述用戶自定義的詞素在代碼中的類型,從而將Perl語言中上下文相關(guān)的文法轉(zhuǎn)換成了上下文無關(guān)的文法,從而使得現(xiàn)有技術(shù)中的語法分析器能夠處理,克服了現(xiàn)有技術(shù)中語法分析器無法處理Perl源代碼的問題。以上所述,僅為本發(fā)明的具體實施方式
,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應以權(quán)利要求所述的保護范圍為準。
權(quán)利要求
1.一種源代碼解析方法,其特征在于,包括在采用語法分析器對Perl源代碼進行解析之前,獲取Perl源代碼中的函數(shù)信息和變量信息,其中所述函數(shù)信息包括系統(tǒng)函數(shù)和用戶自定義的函數(shù),所述變量信息包括系統(tǒng)變量以及用戶自定義的包變量和詞法變量;為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量分別設置一對應的前綴標識符;在對Perl源代碼的解析過程中,如果根據(jù)得到函數(shù)信息和符號信息確定得到的詞素為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量中的一個,在所述詞素之前增加對應的前綴標識符,得到處理后的代碼,將所述處理后的代碼作為語法分析器所要解析的代碼。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述用戶自定義的函數(shù)對應的前綴標識符為“&”。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述得到的詞素為用戶自定義的函數(shù)的條件包括該詞素有函數(shù)調(diào)用信息;該詞素不為函數(shù)信息中的系統(tǒng)函數(shù)的表達式。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述得到的詞素為用戶自定義的詞法變量的條件包括該詞素為變量信息;該詞素不是變量信息中的系統(tǒng)變量的表達式; 該詞素與變量信息中該詞素所在工作域中的一個詞法變量相同。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述得到的詞素為用戶自定義的包變量的條件為該詞素為變量信息;該詞素與變量信息中系統(tǒng)變量均不同;該詞素與變量信息中該詞素所在工作域中的詞法變量均不同;該詞素與變量信息中該詞素所在工作域中的一個包變量相同。
6.一種源代碼解析系統(tǒng),其特征在于,包括獲取裝置,用于在采用語法分析器對Perl源代碼進行解析之前,獲取Perl源代碼中的函數(shù)信息和變量信息,其中所述函數(shù)信息包括系統(tǒng)函數(shù)和用戶自定義的函數(shù),所述變量信息包括系統(tǒng)變量以及用戶自定義的包變量和詞法變量;設置裝置,用于為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量分別設置一對應的前綴標識符;處理裝置,用于在對Perl源代碼的解析過程中,如果根據(jù)得到函數(shù)信息和符號信息確定得到的詞素為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量中的一個,在所述詞素之前增加對應的前綴標識符,得到處理后的代碼,將所述處理后的代碼作為語法分析器所要解析的代碼。
7.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述設置裝置所設置的用戶自定義的函數(shù)對應的前綴標識符為“&”。
8.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括第一識別裝置,用于在得到的詞素滿足如下全部條件時,識別該詞素為為用戶自定義的函數(shù),其中所述條件包括 該詞素有函數(shù)調(diào)用信息; 該詞素不為函數(shù)信息中的系統(tǒng)函數(shù)的表達式。
9.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括第二識別裝置,用于在得到的詞素滿足如下全部條件時,識別該詞素為用戶自定義的詞法變量,其中所述條件包括 該詞素為變量信息;該詞素不是變量信息中的系統(tǒng)變量的表達式; 該詞素與變量信息中該詞素所在工作域中的一個詞法變量相同。
10.根據(jù)權(quán)利要求6所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括第三識別裝置,用于在得到的詞素滿足如下全部條件時,識別該詞素為用戶自定義的包變量,其中所述條件包括 該詞素為變量信息; 該詞素與變量信息中系統(tǒng)變量均不同; 該詞素與變量信息中該詞素所在工作域中的詞法變量均不同; 該詞素與變量信息中該詞素所在工作域中的一個包變量相同。
全文摘要
本發(fā)明提供一種源代碼解析方法和系統(tǒng)。所述方法,包括在采用語法分析器對Perl源代碼進行解析之前,獲取Perl源代碼中的函數(shù)信息和變量信息,其中所述函數(shù)信息包括系統(tǒng)函數(shù)和用戶自定義的函數(shù),所述變量信息包括系統(tǒng)變量以及用戶自定義的包變量和詞法變量;為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量分別設置一對應的前綴標識符;在對Perl源代碼的解析過程中,如果根據(jù)得到函數(shù)信息和符號信息確定得到的詞素為用戶自定義的函數(shù)和用戶自定義的包變量和詞法變量中的一個,在所述詞素之前增加對應的前綴標識符,得到處理后的代碼,將所述處理后的代碼作為語法分析器所要解析的代碼。
文檔編號G06F11/36GK102426550SQ201110328589
公開日2012年4月25日 申請日期2011年10月26日 優(yōu)先權(quán)日2011年10月26日
發(fā)明者吳世忠, 張東升, 時志偉, 李守鵬, 王眉林, 郭濤 申請人:中國信息安全測評中心, 北京啟明星辰信息安全技術(shù)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1