2009-09-16 65 views
11

我們需要生成Java源代碼。我們通過對抽象語法樹進行建模並使用樹沃克生成實際的源代碼文本來實現此目的。這一切都很好。生成java代碼解析樹並對其進行評估

由於我的AST代碼有點舊,它不支持註釋和泛型。所以我正在尋找開放項目,以用於將來需要代碼生成的項目。這就是實際問題出現的地方。我們想要測試生成的代碼是否具有正確的行爲。

這裏是我得到的想法,實際上評估AST而不是生成Java源代碼,編譯它,並針對該代碼運行測試。評估者會加速單元測試,並且可以評估更小的生成代碼片段,例如只有一種方法,使得「單位」更合理。

到目前爲止,我發現com.sun.codemodel項目對於作爲現代(支持java5和6功能)基於AST的代碼生成解決方案來說似乎相當不錯。

任何人都知道是否有另一個項目可以讓我直接評估AST片段(例如單個生成的方法)?

+1

+1有趣的問題,我們想知道答案現在:-) – KLE 2009-09-16 09:51:51

+1

我只是生成該方法的代碼,編譯和測試。創建一個解釋器是相當多的工作。 – 2009-09-16 09:57:01

+0

是沒有任何方法可以使javac的發射解析樹和中介交涉之類的東西? (類型決議,課堂查詢,無論艾拉巴克斯特在答案中如何表達)。 – 2014-04-27 01:45:16

回答

2

獲取更多信息,以評估Java中,你需要所有的語義分析與它一起去(「這是什麼標識符的範圍是什麼?它有哪些類型?」),以及作爲口譯員。要獲得該語義分析,您需要的不僅僅是一個AST:您需要全名解析(符號表構建)和類型解析(確定表達式類型並驗證表達式在找到它們的上下文中是否有效) ), 以及類的查找(其實際的方法做FOO指什麼?)

有了這一點,你可以考慮在爬在執行順序樹上建一個解釋。你還需要建立一個存儲管理器;你可能不需要做一個完整的垃圾回收器,但你需要一些東西。如果你真的想運行某些東西,你還需要一個解釋器 。這意味着你需要一個解析器 (以及類文件的名稱/類型解析)。

我不知道Eclipse是否擁有所有這些(至少可以免費獲得存儲管理器部分:)。考慮到它最初的設計是爲了支持Java開發,我期待它,但多年來我一直對很多工具感到非常失望。

DMS Software Reengineering Toolkit也是一個程序分析/轉換處理多種語言。它具有完整的Java front end,包括解析,AST構建,符號表構造和名稱解析,類型解析,構建調用圖(解析虛擬函數調用所需)以及具有.class文件讀取器的名稱解析引導。所以這將是建立口譯員的良好基礎。 DMS也可以構造任意的AST,然後從它們生成源代碼,所以它也可以處理代碼生成結束,也很好。

[DMS存在的原因是「非常失望」部分。

2

我不確定這是不是您想要的,但Eclipse的JDT項目提供了一個關於Java AST(包括Java 5和6功能)的非常好的視圖。它有一系列用於代碼查看/重寫(不一定是生成)的實用程序和工具。他們都是根據Eclipse公共許可證獲得許可的。

您可以在http://eclipse.org/jdt/

+1

是啊,一個和Sun的codemodel似乎是由建築物的AST生成代碼的最佳選擇。但是,我想要的另外,是解釋AST(使用編譯Java後的語義)的能力。 – Christian 2009-09-16 21:07:19

+0

JDT Core(位於http://www.eclipse.org/jdt/core/index.php)包含以下內容:「在剪貼簿頁面或調試器上下文中的評估支持。」我會看看它...... – 2009-10-07 16:56:27