欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ast解析java代碼 java ast 解析

用Java怎么解析C/C++代碼生成AST抽象語法樹結構

其中一個明顯的例子是Eclipse CDT里的parser。

10年的阜平網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整阜平建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)建站從事“阜平網(wǎng)站設計”,“阜平網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

它是完全用Java實現(xiàn)的,手寫的遞歸下降parser,能把C或C++源碼parse成AST供Eclipse CDT的IDE功能使用。它支持C99語法(包括GCC擴展)、C++語法(我沒仔細看現(xiàn)在支持到什么版本了)等。

它并不用于實際的編譯(這跟Eclipse JDT里的Eclipse Compiler for Java不同);實際編譯還是交給諸如GCC、xlc之類的編譯器去完成。

關于Eclipse CDT里的C與C++ parser的介紹,請參考

JDT的好處是什么?

JDT(java development tooling)是Eclipse提供的一組API。其功能引用其官方文檔上的說法:

Programmatically manipulate Java resources, such as creating projects, generating Java source code, performing builds, or detecting problems in code. Programmatically launch a Java program from the platform. Provide a new type of VM launcher to support a new family of Java runtimes. Add new functions and extensions to the Java IDE itself. 總之,提供了一系列強大的API供我們操作Java代碼。

JDT實際上是將Java代碼構建成一個基于DOM結構的抽象語法樹AST(Abstract Syntax Tree )。代碼中的每個部分都對應一個ASTNode,許多的ASTNode就構成了這個抽象的語法樹。Java Class一般對應Compilation Unit node,該節(jié)點也是AST樹上的頂點。創(chuàng)建一個AST如下:

java 代碼

ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource("".toCharArray()); CompilationUnit unit = (CompilationUnit) parser.createAST(null); unit.recordModifications(); AST ast = unit.getAST();

其中createAST,當parse需要較長時間時,可以采用createAST(new NullProgressMonitor()),否則直接傳null即可。

recordModifications()用于記錄節(jié)點的變動,比如修改、刪除等,當需要對AST樹進行變動操作時,必須要預先調(diào)用這個方法。

比較重要的是:一個AST樹上的所有節(jié)點必須都屬于該AST。不允許直接將其他AST樹上的節(jié)點添加該AST樹上。否則會拋出java.lang.IllegalArgumentException異常。須使用ASTNode.copySubtree(AST target, ASTNode node)返回一個目標樹的深度拷貝,才能進行添加操作。例如: java 代碼ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource("".toCharArray()); CompilationUnit targetRoot= (CompilationUnit) parser.createAST(null); targetRoot.recordModifications(); parser.setSource("class T{}”".toCharArray()); CompilationUnit srcRoot= (CompilationUnit) parser.createAST(null); //這是非法操作,兩者的AST源不一樣 targetRoot.types().add(srcRoot.types().get(0)); //這是合法操作 targetRoot.types().add(ASTNode.copySubtree( targetRoot.getAST(), (ASTNode) srcRoot.types().get(0))); //這是合法操作 targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());

可以查百度百科的

java parser

java parser是什么,讓我們一起了解一下?

Java Parser是基于JavaCC作為Java語言詞法解析的工具,支持Java語言生成AST(Abstract Syntax Tree抽象語法樹),在AST基礎上進行類型推斷分析,支持修改AST從而生成新的Java文件內(nèi)容,支持從Java 1.0到14所有的版本的AST解析。

AST結構允許以一種簡單的編程方式使用Java代碼。可以專門操作Java文件,使用起來也更簡單。它提供了一種方便的機制,可以使用我們稱為“訪客支持”的功能來導航樹。這使開發(fā)人員能夠專注于在源代碼中識別有趣的模式,而不必編寫費力的樹遍歷代碼。該庫的最終主要功能是能夠操縱源代碼的基礎結構。然后可以將其寫入文件,為開發(fā)人員提供構建自己的代碼生成軟件的便利。

那么我們使用JavaParser theere時,總是希望進行很多操作。

例如,我們希望對整個項目進行操作,因此在給定目錄的情況下,我們將探索所有Java文件。 此類應有助于完成此任務:

package?me.tomassetti.support; import?java.io.File; public?class?DirExplorer?{ public?interface?FileHandler?{ void?handle(int?level,?String?path,?File?file); } public?interface?Filter?{ boolean?interested(int?level,?String?path,?File?file); } private?FileHandler?fileHandler; private?Filter?filter; public?DirExplorer(Filter?filter,?FileHandler?fileHandler)?{ this.filter?=?filter; this.fileHandler?=?fileHandler; } public?void?explore(File?root)?{ explore(0,?"",?root); } private?void?explore(int?level,?String?path,?File?file)?{ if?(file.isDirectory())?{ for?(File?child?:?file.listFiles())?{ explore(level?+?1,?path?+?"/"?+?child.getName(),?child); } }?else?{ if?(filter.interested(level,?path,?file))?{ fileHandler.handle(level,?path,?file); } } } }

對于每個Java文件,我們首先要為每個Java文件構建一個抽象語法樹(AST),然后對其進行導航。 這樣做有兩種主要策略:

1、使用訪客:要在特定類型的AST節(jié)點上進行操作時,這是正確的策略。

2、使用遞歸迭代器:這允許處理所有類型的節(jié)點。

文章題目:ast解析java代碼 java ast 解析
標題鏈接:http://www.chinadenli.net/article14/dddhoge.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄外貿(mào)網(wǎng)站建設靜態(tài)網(wǎng)站建站公司網(wǎng)站維護微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設