【问题标题】:How to traverse an AST created with clang in Rascal如何遍历在 Rascal 中使用 clang 创建的 AST
【发布时间】:2014-03-10 15:45:22
【问题描述】:

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

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

在 Rascal 中遍历 Clang AST 是否有更省时的方法?

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

【问题讨论】:

    标签: clang abstract-syntax-tree rascal


    【解决方案1】:

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

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

    ifStatement(intConstant(1),[])

    之后,您可以使用ValueIO:readTextValueFile(#node, file) 在AST 中读取它,或者您可以使用ShellExec 库和readTextValueString 函数。

    这将为您提供键入 node 的 AST 表示。如果你想要一个类型化的表示,那么还需要生成数据声明,如下所示:

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

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

    【讨论】:

    • 顺便说一句,其他人已经将 Eclipse 的 JDT AST 映射到 Rascal、C# AST、PHP AST 等。有时我们甚至为同一种语言的不同前端做了两次。这样做确实为您提供了前端对语言的假设,但使用 Rascal 您可以快速分析输入并将其转换为其他内容。
    • Clang 版本
    【解决方案2】:

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

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

    我从来没有见过它做得非常成功,而且真的一点也不省力。如果您有 Clang AST,并且想要处理它,请坚持使用 Clang。

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

    【讨论】:

    • 嗨,艾拉。这听起来像是我们应该在某一天进行的大型讨论的开始:-) 但不是在 stackoverflow 上。
    • 很抱歉,这是我多年来通过查看许多尝试这样做的系统得出的结论。也许流氓改变了这个等式。是的,我们应该就一杯好啤酒进行讨论。
    • 是的!让我们这样做,也许我们可以一起浏览一些代码。
    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多