我嘗試使用python中的Javalang模塊來獲取Java源代碼的AST,但它需要整個類來生成AST。傳遞一段代碼就像'if'語句一樣會引發錯誤。還有其他的方式嗎? PS:我最好在尋找一個python模塊來完成這項任務。 謝謝有什麼辦法可以在Java中獲得代碼塊的AST(抽象語法樹)而不是整個類?
2
A
回答
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
相關問題
- 1. 抽象語法樹(AST)中的常見屬性是什麼?
- 2. 有什麼辦法可以在java中實現'抽象類方法'嗎?
- 3. 檢查Rascal Java抽象語法樹中的修飾符AST
- 4. 在C++中表示一個多遍抽象語法樹(AST)?
- 5. 有什麼辦法可以獲得java中每個csv列的數據類型?
- 6. 有什麼辦法可以改進這個Java代碼?
- 7. 有沒有辦法在Java中而不是整個類中的線程方法?
- 8. 有什麼辦法可以在Delphi 7中獲得代碼摺疊?
- 9. 在F#中轉換抽象語法樹(AST)
- 10. 在Clojure中評估AST(抽象語法樹)
- 11. RSPEC獲得抽象語法樹中的所有測試/預期
- 12. 將分析樹轉換爲AST(抽象語法樹)C++
- 13. Netbeans中的AST(抽象語法樹)視圖
- 14. 有什麼辦法可以在UILabel中獲得NSRange的CGRects?
- 15. 有什麼辦法可以爲同一個類使用groovy和java代碼嗎?
- 16. 解析樹和抽象語法樹有什麼區別?
- 17. 解析不可信代碼的抽象語法樹是否安全?
- 18. 使用ANTLR爲java源代碼生成抽象語法樹
- 19. 將java代碼解析爲抽象語法樹
- 20. 有什麼辦法可以檢測Java中的RTL語言嗎?
- 21. 有什麼辦法可以獲得Concordion測試的代碼覆蓋率?
- 22. 關於抽象語法樹(AST)的問題
- 23. 什麼是抽象語法樹/是否需要?
- 24. 代表C#3在XML代碼作爲抽象語法樹
- 25. Clang:AST(抽象語法樹)是什麼樣的?
- 26. 有沒有什麼辦法可以在randperm中獲得不同的混洗?
- 27. 有什麼辦法可以在Eclipse中獲得這種類型的換行符?
- 28. 有什麼辦法可以減少這個ado.net代碼嗎?
- 29. 有沒有什麼辦法可以讓我優化這個java代碼?
- 30. 如何從BNF設計抽象語法樹(AST)
「但它需要一個完整的類來生成AST」我認爲這是可以預期的是Java本身要求每一段代碼是內部的類? – DeepSpace
更具體地說,我想比較兩個代碼片段中的一個是否只是其他的重構或者是否存在邏輯上的改變?所以我雖然比較他們的AST –
如果你不堅持一個Python解決方案,我有一個實際的答案。 –