我正在尋找可用於常見命令式語言(Java,C,python,ruby等)的抽象語法樹表示法。我希望這個儘可能接近源代碼(而不是LLVM)。我在網上找到了Rose,但它只能處理C和Fortran。這是否存在?命令式語言的抽象語法樹
回答
你不會找到可以表示多種語言的「一個」通用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擅長處理不明確的語法)。
- 1. XML是抽象語法的語言嗎?
- 2. 遍歷抽象語法樹
- 3. 開發抽象語法樹
- 4. 增強抽象語法樹
- 5. 打印抽象語法樹
- 6. GCC抽象語法樹
- 7. 抽象語法樹問題
- 8. 抽象語法樹與對象模型
- 9. Eclipse的抽象語法樹DIFF
- 10. 在OCaml中抽象語法樹的S-表達式樹
- 11. 如何評估一個新的編程語言的抽象語法樹
- 12. 解析單元測試斷言使用抽象語法樹
- 13. 類似於SQL的語法選擇命令式語言
- 14. 如何在野牛中顯示語法的抽象語法樹?
- 15. 抽象語法樹構造和遍歷
- 16. 字符串到抽象語法樹
- 17. F#解析抽象語法樹
- 18. 從堆棧創建抽象語法樹
- 19. 如何構建抽象語法樹
- 20. 如何解釋鏈式比較操作的抽象語法樹?
- 21. 和風ASDL(抽象語法描述語言)
- 22. 如何將我的分析樹簡化爲抽象語法樹?
- 23. Esoterical語言,ComeFrom命令
- 24. Scala中的抽象語言/ Java
- 25. 解析樹和抽象語法樹有什麼區別?
- 26. 將分析樹轉換爲AST(抽象語法樹)C++
- 27. 自然語言處理/命令(序言)
- 28. 查找抽象語法樹中的變量/方法引用
- 29. Java中的對象樹導航語言
- 30. ado命令對象的語法錯誤