摘要:另載于這是一個關于抽象語法樹的故事。抽象語法樹是對程序代碼的結構化表示,是對代碼進行詞法分析語法分析后得到的產物。
另載于 http://www.qingjingjie.com/blogs/2
這是一個關于抽象語法樹(Abstract Syntax Tree, AST)的故事。
抽象語法樹是對程序代碼的結構化表示,是對代碼進行詞法分析、語法分析后得到的產物。編譯器要用到它,很多生產力工具也要用它,例如:
IDE可以自動重構、自動生成一些代碼、自動對不規范代碼發出警告。這是很強很實惠的功能。 一個大型軟件項目常常有幾百人合作,幾百萬行代碼。很多代碼規范難以百分百落實,很多編程錯誤潛藏在項目中。這時候我們會考慮Sonar, FindBug, Checkstyle之類的代碼分析工具來幫助我們掃描出巨量代碼中存在的問題。 國內有位老兄就做了個自動生成測試代碼的工具。(但不要生成功能代碼,我們要構建良好的抽象和簡潔的代碼) 我司的系統要進行架構遷移,其中有百萬行代碼需要修改,用人力來做是很可怕的。我做了個工具來自動完成這件事。
它們利用AST來對大量程序代碼做自動化處理,給了我們莫大的幫助。甚至自動寫代碼也不是不可能。那么我們自己能玩一玩AST這種高大上的東西嗎?
能。Eclipse這個開源的Java IDE就提供了一個庫來幫助我們達到目的,它的名字是JDT(Java Development Tools)。我們使用它的核心模塊JDT Core。
這個項目歷史悠久,功能強力,早期開發者有《設計模式》GoF的作者。
它提供了一套關于AST的API,能解析Java代碼,生成、分析和操作AST結構。有了它,我們就不用自己實現高難度的詞法分析和語法分析了。
動手搞起(嫌麻煩可以看這個小框架 https://github.com/sorra/exia)
首先準備好庫文件——打開你的Eclipse安裝目錄,在搜索框中搜索以下jar文件(*是通配符):
org.eclipse.jdt.core_*
org.eclipse.core.contenttype_*
org.eclipse.core.jobs_*
org.eclipse.core.resources_*
org.eclipse.core.runtime_*
org.eclipse.equinox.common_*
org.eclipse.equinox.preferences_*
org.eclipse.equinox.registry_*
org.eclipse.osgi_*
org.eclipse.text_*
如果有多個版本,取最新版本。統統copy出來,添加到你的項目中。
源代碼包是org.eclipse.jdt.core.source_* 用Eclipse的Attach source功能把它連到第一個jar上,可以閱讀源代碼。
先來溜一段起步代碼,把一段Java代碼解析成AST。
import java.util.Map; import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.JavaCore; ...... public static void main(String[] args) { ASTParser parser = ASTParser.newParser(AST.JLS4); //設置Java語言規范版本 parser.setKind(ASTParser.K_COMPILATION_UNIT); MapcompilerOptions = JavaCore.getOptions(); compilerOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7); //設置Java語言版本 compilerOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7); compilerOptions.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7); parser.setCompilerOptions(compilerOptions); //設置編譯選項 char[] src = "class A { void method1(int b){;} }".toCharArray(); parser.setSource(src); CompilationUnit cu = (CompilationUnit) parser.createAST(null); //這個參數是IProgessMonitor,用于GUI的進度顯示,我們不需要,填個null. 返回值是AST的根結點 System.out.println(cu); //把AST直接輸出看看啥樣 }
AST作為抽象語法樹,它就是一棵樹,有點像XML的DOM樹。
例子中的樹大概長這樣:
CompilationUnit | class | | A method1 | | | void [] {} | | arg ; | | int b
延伸閱讀:http://help.eclipse.org/ 點擊JDT Plug-in User Guide -> Programmer"s Guide -> JDT Core。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64111.html
摘要:請下載一份源代碼,這里有個對應的源碼包元素的組合需要遵守基本的語法規則不是全部。名字也是表達式的一種,是指變量名類名包名等元素,它們在中都屬于抽象類,分為和兩種具體類。 另載于 http://www.qingjingjie.com/blogs/3 上篇博客末尾提到了一棵抽象語法樹長什么樣子。JDT提供了一套DOM API來讓我們順利地控制這樣一棵樹。 讀完本篇后請繼續完成上篇的延伸閱讀...
摘要:是由創始人設計的又一個開源日志組件。此外完整實現使你可以很方便地更換成其它日志系統如或。訪問模塊與容器集成提供通過來訪問日志的功能。依賴配置的核心,包建議使用來管理日志,方便替換底層實現,要用,就在依賴中加入包和包。 Logback是由log4j創始人設計的又一個開源日志組件。logback當前分成三個模塊:logback-core,logback-classic和logback-ac...
摘要:最后提供一段我用寫的代碼供參考行就能把任意代碼結構轉換成輸出使用了庫利用強大的屬性描述符,寫出通用的轉換代碼,避免了給每個結點類寫對應的轉換代碼幾十種結點類,要死啊。 另載于 http://www.qingjingjie.com/blogs/4 上篇介紹的形形色色的語法元素大概讓人眼花繚亂了,而且每種元素都對應一個Java類。知道是一回事,使用就是另一回事了,這么多個類,要給每個類寫對...
摘要:原文鏈接如題,有的時候,我們會采用自動生成代碼的方式來完成一些任務,比如根據業務數據自動生成調用的供用戶下載使用這樣自動生成的代碼,如果未經格式化處理,基本上是不可讀的正好,我們常用的,快捷鍵就能自動格式化代碼那么,下面這段代碼,就是將的這 原文鏈接:https://gist.github.com/pfmiles/653c8b59e795698c867d 如題,有的時候,我們會采用自...
摘要:是什么是自帶的一個用于程序性能分析的工具,安裝完畢后就有啦,在安裝目錄的文件夾下能找到名稱為。假設我自己實現了一個快速排序算法,我想測一測它的性能。首先我在下圖代碼第行執行我的快速排序算法之處設置一個斷點。回到,按結束應用程序的執行。 VisualVM是什么? showImg(https://segmentfault.com/img/remote/1460000016730111); ...
閱讀 2716·2021-09-24 09:47
閱讀 4366·2021-08-27 13:10
閱讀 2981·2019-08-30 15:44
閱讀 1281·2019-08-29 12:56
閱讀 2594·2019-08-28 18:07
閱讀 2615·2019-08-26 14:05
閱讀 2553·2019-08-26 13:41
閱讀 1265·2019-08-26 13:33