2015-07-10 137 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擅长处理不明确的语法)。