系統識別號 | U0002-1608201815334600 |
---|---|
DOI | 10.6846/TKU.2018.00463 |
論文名稱(中文) | 引用Eclipse剖析器產生java語法樹 |
論文名稱(英文) | Generating Java Syntax Tree by Eclipse Parser |
第三語言論文名稱 | |
校院名稱 | 淡江大學 |
系所名稱(中文) | 資訊管理學系碩士班 |
系所名稱(英文) | Department of Information Management |
外國學位學校名稱 | |
外國學位學院名稱 | |
外國學位研究所名稱 | |
學年度 | 106 |
學期 | 2 |
出版年 | 107 |
研究生(中文) | 黃智健 |
研究生(英文) | Chi-Kin Wong |
學號 | 605630077 |
學位類別 | 碩士 |
語言別 | 繁體中文 |
第二語言別 | |
口試日期 | 2018-06-02 |
論文頁數 | 110頁 |
口試委員 |
指導教授
-
廖賀田
委員 - 劉嘉傑 委員 - 魏世杰 委員 - 廖賀田 |
關鍵字(中) |
語法樹 Eclipse |
關鍵字(英) |
Syntax Tree Eclipse |
第三語言關鍵字 | |
學科別分類 | |
中文摘要 |
我們所開發之語法樹系統TkSynT可用以作為直譯、混亂化等用途。建立語法樹必須要透過剖析器,然而Java程式的語法持續在變動中,這導致剖析器的製作需耗費大量的資源。所以我們引用Eclipse剖析器產生AST語法樹,再利用AST產生TkSynT的語法樹,經過去模糊化後,就可以正常進行直譯及混亂化。 |
英文摘要 |
The syntax tree system TkSynT we have developed can be used for interpretation and obfuscation. Constructing a syntax tree must go through the parser. However, the syntax of the Java program continues to change, which means the parser will require extra resources. Therefore, we use the Eclipse parser to generate an AST syntax tree, then convert AST to the TkSynT syntax tree. After dis-ambiguous, we can perform interpretation and obfuscation. |
第三語言摘要 | |
論文目次 |
目錄 第一章 緒論 1 1.1 研究動機與目的 1 1.2 論文概觀 2 第二章 我們原有的語法樹 (TkSynT) 3 2.1 TkSynT介紹 3 2.1.1 TkSynT在直譯器之運用 3 2.1.2 TkSynT在混亂化之運用 4 2.2 TkSynT的結構 5 2.2.2 Precise節點 6 2.2.3 Ambiguous語法樹 19 2.3 建造TkSynT的方法 26 2.3.1 定義類 26 2.3.2 敘述類語法樹的建造 29 2.3.3 運算式語法樹的建造 30 2.4 我們開發之剖析器 35 第三章 Eclipse 語法樹 37 3.1 Eclipse介紹 37 3.2 Eclipse Parser API概要 37 3.3 ASTView軟體介紹: 38 3.4 ASTNode種類介紹 39 3.4.1 Statement 40 3.4.2 Expression 41 3.4.3 Type 43 3.4.4 VariableDeclaration 44 3.5 ASTNode語樹結構介紹: 45 3.5.1 運算式 45 3.5.2 敘述式 53 3.5.3 定義類 60 第四章 語法樹的比較與轉換 65 4.1 TkSynT vs. AST 65 4.2 ASTParser的使用 66 4.3 AST轉換為TkSynT 70 4.3.1 運算式的轉換 70 4.3.2 敘述式的轉換 75 4.3.3 定義類的轉換 78 第五章 TkSynT語法樹內部型別之整修 81 5.1 Static Nested Classes 81 5.1.1 Static Nested Classes的宣告 81 5.1.2 Static Nested Classes物件的創建 82 5.2 Inner Classes 82 5.2.1 Inner Classes的宣告 82 5.2.2 Inner Classes物件的創建 83 5.2.3 Inner Classes存取enclosing object 83 5.2.4 Inner object與enclosing object 的關係 83 5.2.5 Enclosing object的儲存和設定 85 5.2.6 Inner class的繼承 86 5.2.7 Inner Class的父類建構子呼叫 87 5.3 Local class(局部類別) 88 5.3.1 Local class的Enclosing reference 88 5.3.2 Java對Local class使用外部之區域變數處理 89 5.4 Anonymous Class 90 5.4.1 Anonymous class的宣告 90 5.4.2 Anonymous class的預設建構子 91 5.5 TkSynT 內部型別語法樹之修正 92 5.5.1 Nested Types與Local Classes之語法樹 92 5.6 TkSynT的Inner Class在編譯時之處理 93 5.6.1 Inner Class類別實例創建節點在剖析期時之處理 93 5.6.2 Inner Class類別實例創建節點在連結期時之處理 93 5.7 TkSynT的Anonymous class在編譯時之處理 95 5.7.1 Anonymous class類別實例創建節點在剖析期時之處理 95 5.7.2 Anonymous class類別實例創建節點在連結期時之處理 96 5.8 TkSynT Inner Class和Local Class父類別呼叫節點在連結期之處理 96 5.9 TkSynT加入Local Class後架構之修改 98 第六章 增補TkSynT語法樹 100 6.1 ForEach節點 100 6.2 Static Import 節點 101 第七章 實驗案例 102 第八章 結論與後續工作 105 8.1 結論 105 8.2 後續工作 105 參考文獻 106 附錄 108 圖目錄 圖 2 1直譯器之運用 4 圖 2 2 混亂化之運用 4 圖 2 3 前置運算符 7 圖 2 4 一元運算符語法樹結構 7 圖 2 5 二元運算符語法樹結構 8 圖 2 6 設值運算符語法樹結構 8 圖 2 7 三元運算符語法樹結構 9 圖 2 8 陣列存取語法樹結構 9 圖 2 9 2維陣列存取語法樹結構 9 圖 2 10 算式敘述的語法樹結構 10 圖 2 11 區塊敘述的語法樹結構 11 圖 2 12 區域變數宣告敘述的語法樹結構 11 圖 2 13 if敘述的語法樹結構 12 圖 2 14 switch敘述的語法樹結構 12 圖 2 15 case敘述的語法樹結構 12 圖 2 16 for迴圈語法樹結構 13 圖 2 17 while迴圈語法樹結構 14 圖 2 18 do-while迴圈語法樹結構 14 圖 2 19 try敘述的語法樹結構 15 圖 2 20 catch敘述的語法樹結構 15 圖 2 21 型別定義的類別繼承圖 16 圖 2 22 欄位定義類別圖 17 圖 2 23 函數定義類別圖 17 圖 2 24 建構子定義類別圖 18 圖 2 25 AmbigCallTN的語法樹結構 21 圖 2 26 DotAmbigMtdTN的語法樹結構 22 圖 2 27 AmbigMtdNameTN的語法樹結構 22 圖 2 28 PreciseCallTN的語法樹結構 22 圖 2 29 DotStaticMtdTN的語法結構 23 圖 2 30 DotInstMtdTN的語法結構 23 圖 2 31 AmbigNewTN的語法樹結構 24 圖 2 32 AmbigDotNewTN的語法樹結構 24 圖 2 33 PreciseNewTN的語法樹結構 24 圖 2 34 PreciseDotNewTN的語法樹結構 25 圖 2 35 AmbigNewArrTN的語法樹結構 25 圖 2 36 PreciseNewArrTN的語法樹結構 25 圖 2 37 TkParser剖析步驟 35 圖 3 1 ASTView軟體 38 圖 3 2 ASTNode類別繼承圖 39 圖 3 3 BodyDeclaration類別繼承圖 39 圖 3 4 Comment類別繼承圖 40 圖 3 5 型別類別繼承圖 43 圖 3 6 變數宣告類別繼承圖 44 圖 3 7 文數字類節點的語法樹 45 圖 3 8 二元運算符樹狀結構比較 46 圖 3 9 AST三元運算符的語法樹 48 圖 3 10 AST陣列存取的語法樹 48 圖 3 11 AST二維陣列存取的樹狀結構 48 圖 3 12 Ambiguous節點例子 49 圖 3 13 Ambiguous節點例子樹狀圖 49 圖 3 14 Precise節點例子樹狀圖 50 圖 3 15 函數的Ambiguous節點樹狀圖 51 圖 3 16 函數的Precise節點樹狀圖 51 圖 3 17 類別實例創建的語法樹 52 圖 3 18 陣列建立的語法樹 52 圖 3 19 AST變數宣告的語法樹 54 圖 3 20 TkSynT變數宣告的語法樹 54 圖 3 21 AST if條件敘述 55 圖 3 22 AST Switch-case 敘述 56 圖 3 23 AST for迴圈 56 圖 3 24 TkSynT for迴圈 57 圖 3 25 AST ForEach迴圈 57 圖 3 26 TkSynT ForEach迴圈 58 圖 3 27 AST WhileStatement 58 圖 3 28 AST DoStatement 58 圖 3 29 AST TryStatement 59 圖 3 30 AST類別宣告類別圖 60 圖 3 31 AST 欄位定義的語法樹 61 圖 3 32 VariableDeclarationFragment 的語法樹 62 圖 3 33 TkSynT TLvFldDefTN 的語法樹 62 圖 4 1 AST轉換為TkSynT過程 70 圖 4 2 運算式轉換函數 71 圖 4 3 二元運算式的轉換 72 圖 4 4 AST的二元運算式例子 72 圖 4 5 TkSynT的二元運算式例子 73 圖 4 6 方法呼叫轉換函數 74 圖 4 7 AST 方法呼叫語法樹 74 圖 4 8 TkSynT 方法呼叫語法樹 75 圖 4 9 敘述式轉換函數 75 圖 4 10 運算式敘述轉換函數 76 圖 4 11 區塊敘述轉換函數 76 圖 4 12 AST變數宣告樹狀結構 77 圖 4 13 TkSynT變數宣告樹狀結構 78 圖 4 14 檔案節點轉換函數 79 圖 4 15 型別轉換函數 79 圖 4 16 類別內部轉換函數 80 圖 5 1 Static Nested Classes物件的創建 82 圖 5 2 Inner object與enclosing object 的關係 84 圖 5 3 執行結果 84 圖 5 4 預設建構子 85 圖 5 5 反組譯結果 86 圖 5 6 inner class物件在創建時的流程 86 圖 5 7 inner class的繼承 87 圖 5 8 5.2.7 Inner Class的父類建構子呼叫 88 圖 5 9 Local class使用外部之區域變數例子 89 圖 5 10 使用一般類別模擬local class 90 圖 5 11 5.4.1 Anonymous class的宣告 91 圖 5 12 Inner Class AmbigNewTN在連結期時之處理 94 圖 5 13 inner class AmbigDotNewTN在連結期時之處理 95 圖 5 14 Anonymous class 在連結期時之處理 96 圖 5 15 TkSynT Inner Class和Local Class父類別呼叫節點在連結期之處理 98 圖 6 1 6.1 ForEach節點樹狀結構 101 圖 7 1 電梯系統執行結果 102 圖 7 2 魔方系統執行結果 103 圖 7 3 天文系統執行結果 104 表目錄 表 1 一元運算符對照表 45 表 2 二元運算符的對照表 47 |
參考文獻 |
參考文獻 [1] 郭肇安,“Java的語法樹與直譯機制”,淡江大學資訊管理學系碩士論文,2006/6 [2] 賴政良,“移除動態繫結的程式碼混亂化”,淡江大學資訊管理學系碩士論文,2009/6 [3] Eclipse http://www.eclipse.org [4] Eclipse AST View, http://www.eclipse.org/jdt/ui/astview/index.php [5] By Thomas Kuhn, Eye Media GmbH, Olivier Thomann, IBM Ottawa Lab, Abstract Syntax Tree http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html [6] Eclipse documentation, Oxygen http://help.eclipse.org/oxygen/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html [7] James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley and Daniel Smith, "The Java® Language Specification Java SE 9 Edition" [8] Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman, "Compilers: Principles, Techniques, and Tools, 2/e", 2010 [9] Heh-Tyan Liaw*, and Shih-Chieh Wei, "Obfuscation for object-oriented programs: dismantling instance methods," Software-Practice and Experience, [SCI] Volume 44, Issue 9, pp. 1077–1104, September 2014 DOI 10.1002/spe.2193 [10] Deitel HM, Deitel PJ. Java How to Program, 5th edition. Pearson Prentice Hall: Upper Saddle River, New Jersey, 2003. [11] Heh-Tyan Liaw,“魔術方塊程式”, version 1, 2000/8. ftp://mail.im.tku.edu.tw/Prof_Liaw/Game/MCube,。 [12] Heh-Tyan Liaw, “魔術方塊程式”, version 2, 2017/5/4. 未發表的程式。 [13] <第10屆全國大專院校資訊管理實務專題暨資訊服務創新競賽> ICT2資訊技術組第一名, 天文觀星系統 (鄭立婷, 黃于珍, 劉定衡, 鐘文婕, 鄭聿倫, 林玟佑, 方姿文), 民國94年12月17日 [14] By Ken Arnold, James Gosling, David Holmes, "java programming language 4th edition" |
論文全文使用權限 |
如有問題,歡迎洽詢!
圖書館數位資訊組 (02)2621-5656 轉 2487 或 來信