如何遍历在Rascal中使用clang创建的AST

时间:2014-03-10 15:45:23

标签: clang abstract-syntax-tree rascal

我尝试使用Rascal来计算使用Objective C代码中的Clang创建的AST的度量。 由于Clang AST的结构与Rascal中使用的结构不同,我认为它需要一些重构或变通方法才能使用它。

一种方法是编写一个翻译AST的解析器。另一种方法是使用递归的正则表达式。但是Clang AST中有很多元素,编写解析器或函数需要一些时间。

在Rascal中穿越Clang AST的时间是否较少?

In the Clang AST introduction is a small sample of the AST

2 个答案:

答案 0 :(得分:0)

我认为最好针对Clang AST API编写一些代码,以Rascal可读形式打印AST。我们也将此策略用于其他前端。

即。使用http://clang.llvm.org/docs/RAVFrontendAction.html中的信息创建一个递归的AST访问者,打印如下内容:

ifStatement(intConstant(1),[])

在此之后,您可以使用ValueIOreadTextValueFile(#node, file)在AST中阅读它,或者您可以使用ShellExec库和readTextValueString函数。

这将为您提供AST类型node的表示。如果需要类型化表示,则还需要生成数据声明,如:

data Statement = ifStatement(Expression cond, list[Statement] body);

顺便说一句,如果有人已经为Clang AST编写了一个JSON或XML导出器,那么你就会成为王者,因为Rascal可以直接读取这些格式的库。

答案 1 :(得分:0)

人们总是试图在工具之间移动AST,因此他们不必使用原始工具来完成工作。这是"软件工具总线"概念

这通常只是一个令人头疼的问题,因为每个工具都有一组关于AST的结构和含义的假设,而另一个工具没有或没有共享。因此,您不仅要构建AST转换工具,还要经常填写其他工具"。

我从来没有看到它成功完成,而且它确实无法省力。如果你有一个Clang AST,并且想要处理它,那就坚持使用Clang。

[我会说所有可能侥幸逃脱的人,尤尔根是最有可能的人之一。如果你不是Jurgen,你可能会遇到更多麻烦。]