2016-08-16 41 views
2

我嘗試使用python中的Javalang模塊來獲取Java源代碼的AST,但它需要整個類來生成AST。傳遞一段代碼就像'if'語句一樣會引發錯誤。還有其他的方式嗎? PS:我最好在尋找一個python模塊來完成這項任務。 謝謝有什麼辦法可以在Java中獲得代碼塊的AST(抽象語法樹)而不是整個類?

+0

「但它需要一個完整的類來生成AST」我認爲這是可以預期的是Java本身要求每一段代碼是內部的類? – DeepSpace

+0

更具體地說,我想比較兩個代碼片段中的一個是否只是其他的重構或者是否存在邏輯上的改變?所以我雖然比較他們的AST –

+0

如果你不堅持一個Python解決方案,我有一個實際的答案。 –

回答

0

OP對非Python的答案感興趣。

我們的DMS Software Reengineering Toolkit與它的Java Front End可以做到這一點。

DMS是解析/分析/轉換代碼的通用工具,通過語言定義(包括語法)進行參數化。根據語言定義,通過調用langauge參數提供的Parse方法,可以很容易地在表示語法目標符號的源文件/流上調用DMS,DMS將爲解析的字符串構建樹。爲解析由語法語法定義的任意非終結符的源文件/流提供了特別支持; DMS將建立一個其非根端的AST,根據該非端點定義的子語法解析源。

一旦您擁有了AST,DMS爲訪問AST提供了大量支持,檢查/修改節點,使用曲面語法重寫規則在AST上執行源到源轉換。最後你可以打印修改後的AST並獲取有效的源代碼。 (如果你只解析了一個非終結符的代碼片斷,那麼你得到的是該非終結符的有效代碼)。

如果OP願意比較完整的文件而不是片段,我們的Smart Differencer可能是開箱即用的。 SmartDifferencer爲其兩個輸入文件構建AST,在解釋差異的結構化代碼元素上找到最小的一組概念編輯(插入,刪除,移動,複製,重命名),並報告差異。

0

Javalang可以解析Java代碼片斷:

>>> tokens = javalang.tokenizer.tokenize('System.out.println("Hello " + "world");') 
>>> parser = javalang.parser.Parser(tokens) 
>>> parser.parse_expression() 
MethodInvocation 
相關問題