淡江大學覺生紀念圖書館 (TKU Library)
進階搜尋


下載電子全文限經由淡江IP使用) 
系統識別號 U0002-1608201815334600
中文論文名稱 引用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"
論文使用權限
  • 同意紙本無償授權給館內讀者為學術之目的重製使用,於2018-08-20公開。
  • 同意授權瀏覽/列印電子全文服務,於2018-08-20起公開。


  • 若您有任何疑問,請與我們聯絡!
    圖書館: 請來電 (02)2621-5656 轉 2486 或 來信