我正在寻找可用于常见命令式语言(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. 遍历抽象语法树
- 2. 抽象语法树问题
- 3. 增强抽象语法树
- 4. Eclipse的抽象语法树DIFF
- 5. 类似于SQL的语法选择命令式语言
- 6. 如何在野牛中显示语法的抽象语法树?
- 7. 字符串到抽象语法树
- 8. F#解析抽象语法树
- 9. 如何构建抽象语法树
- 10. 抽象语法树构造和遍历
- 11. 从堆栈创建抽象语法树
- 12. 如何解释链式比较操作的抽象语法树?
- 13. 和风ASDL(抽象语法描述语言)
- 14. 解析树和抽象语法树有什么区别?
- 15. 测量功能语言和命令式语言的代码复杂度
- 16. 抽象类 - 语法帮助
- 17. 抽象语法树中的Python f字符串的行号
- 18. Haskell编译器中的遍历型抽象语法树
- 19. python:获取导入函数的抽象语法树?
- 20. 这种情况下的抽象语法树?
- 21. 您最喜欢的抽象语法树优化
- 22. 关于抽象语法树(AST)的问题
- 23. 使用GCC获取C程序的抽象语法树
- 24. 用于在Python中编程抽象语法树的库
- 25. 何时使用抽象或具体的语法树?
- 26. C++中的抽象语法树:类与结构
- 27. 抽象语法树(AST)中的常见属性是什么?
- 28. 寻找语音(语音命令)语言+地区/文化背景?
- 29. 元语言抽象的语言比那些只使用反射API的语言执行得更好吗?
- 30. 解析标记成抽象语法树的使用正则表达式