我尝试使用Rascal来计算使用Objective C代码中的Clang创建的AST的度量。 由于Clang AST的结构与Rascal中使用的结构不同,我认为它需要一些重构或变通方法才能使用它。
一种方法是编写一个翻译AST的解析器。另一种方法是使用递归的正则表达式。但是Clang AST中有很多元素,编写解析器或函数需要一些时间。
在Rascal中穿越Clang AST的时间是否较少?
答案 0 :(得分:0)
我认为最好针对Clang AST API编写一些代码,以Rascal可读形式打印AST。我们也将此策略用于其他前端。
即。使用http://clang.llvm.org/docs/RAVFrontendAction.html中的信息创建一个递归的AST访问者,打印如下内容:
ifStatement(intConstant(1),[])
在此之后,您可以使用ValueIO
:readTextValueFile(#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,你可能会遇到更多麻烦。]