2015-07-10 111 views
1

我正在尋找可用於常見命令式語言(Java,C,python,ruby等)的抽象語法樹表示法。我希望這個儘可能接近源代碼(而不是LLVM)。我在網上找到了Rose,但它只能處理C和Fortran。這是否存在?命令式語言的抽象語法樹

回答

-1

你不會找到可以表示多種語言的「一個」通用AST。人們一直在尋找50年。

基本原因是AST節點隱含地表示它編碼的運算符的精確語言語義,而不同的語言對於顯然是相同運算符的語義有不同的語義。

例如,現代Fortran中的「+」運算符將添加整數,實數,複數值和這些數組的切片。 Java「+」會將整數,實數和粘連字符串添加到一起。如果我在「通用AST」中寫了「a + b」,您怎麼知道相應AST編碼的語義效應?

您可以做的是構建一個系統,其中不同語言的AST統一表示,以便您可以跨多種語言共享工具基礎結構。這是通過許多Program Transformation Systems (PTS)完成的,您可以在其中提供語法(或從可用庫中選擇一個語法),然後PTS使用其統一表示法解析和構建AST。大多數PTS提供額外的支持來分析和轉換代碼。

所以,你需要的只是一個PTS和一些汗水來定義一個語法。事實並非如此;爲一門真正的語言獲得語法是非常困難的。更糟的是,Life After Parsing有很多,因爲你需要符號的含義和其他推理,如控制和數據流分析。因此,如果您在開始真正的工作之前不想分心幾個月,您需要完整的前端(例如,解析,名稱/類型解析,流量分析......),或儘可能多地獲得。

這意味着在實踐中是要找到一個工具來處理感興趣的語言給你,成熟的前端已經可用:

  • 玫瑰(你已經發現這個)處理C,C++和Fortran語言。它沒有內置的解析能力;它的前端是定製的。所以它很難擴展到其他語言。但它具有良好的流程分析功能,並提供了通過手寫AST散步/轉換來轉換代碼的方法。
  • Clang處理C和C++。 Clang還使用手工製作的前端。它還可以通過手寫的AST漫步/搗碎來轉換代碼,並有少量的模式匹配支持。據我所知,你必須使用Clang的LLVM部分來進行流量分析。

  • 我們的DMS Software Reengineering Toolkit擁有C,C++,Java和COBOL的完整前端,以及諸如Python等更多語言的完整解析器。 DMS提供基於模式的分析和源到源轉換。它直接從語法中操作(參見Oberon, Nicklaus Wirth's latest language)。 (我不知道任何處理Ruby的工具,這是很難解析的;我知道它的語法不明確,DMS擅長處理不明確的語法)。