命令式语言的抽象语法树

时间:2015-07-10 21:33:24

标签: parsing abstract-syntax-tree imperative-programming

我正在寻找一种抽象的语法树表示,可用于常见的命令式语言(Java,C,python,ruby等)。我希望这尽可能接近源(与LLVM相反)。我在网上找到Rose,但它只能处理C和Fortran。这存在吗?

1 个答案:

答案 0 :(得分:-1)

你不会找到可以代表多种语言的“一个”通用AST。人们一直在寻找50年。

基本原因是AST节点隐式表示其编码的运算符的精确语言语义,并且不同的语言对于明显相同的运算符具有不同的语义。

例如,现代Fortran中的“+”运算符将添加整数,实数,复数值以及此类事物的数组。 Java“+”将添加整数,实数和粘合字符串。如果我在“通用AST”中写了“a + b”,你怎么知道相应的AST编码的语义效应呢?

您可以做的是构建一个系统,在该系统中统一表示不同语言的AST,以便您可以跨多种语言共享工具基础结构。这是由许多Program Transformation Systems (PTS)完成的,您可以在其中提供语法(或从可用库中选择一个),并且PTS使用其统一表示来解析和构建AST。大多数PTS为分析和转换代码提供了额外的支持。

所以,你需要的只是一个PTS,并且有一些汗水来定义一个语法。那真的不是真的;获得正确语言的语法实际上非常困难。更糟糕的是,Life After Parsing有很多,因为您需要符号的含义和其他推断,例如控制和数据流分析。所以你需要完整的前端(例如,解析,名称/类型分辨率,流量分析......),或者你可以得到多少,如果你不想在开始真正的工作之前被分心几个月。< / p>

这在实践中意味着您希望找到一种能够处理您感兴趣的语言的工具,并且已经有了成熟的前端:

  • Rose(你已经发现了这个)处理C,C ++和Fortran。它没有自己的内置解析功能;它的前端是定制的。因此,扩展到其他语言是非常困难的。但它具有良好的流分析功能,并提供了通过手写AST walk / smashes转换代码的方法。
  • Clang处理C和C ++。 Clang也使用手工制作的前端。它还可以通过手写的AST walk / smashes转换代码,并提供少量的模式匹配支持。据我了解,您必须使用Clang的LLVM部分进行流量分析。

  • 我们的DMS Software Reengineering Toolkit具有C,C ++,Java和COBOL的完整前端,以及许多其他语言(如Python)的完整解析器。 DMS提供基于模式的分析和源到源转换。它直接从语法操作(参见Oberon, Nicklaus Wirth's latest language的一个)。 (我不知道有任何处理Ruby的工具,这是很难解析的;我理解它的语法含糊不清,DMS很擅长处理含糊不清的语法。)