【问题标题】:How is code represented in Abstract Syntax Tree?抽象语法树中的代码是如何表示的?
【发布时间】:2014-07-13 21:21:55
【问题描述】:

我正在开发我的自定义 gcc 前端,但关于 AST 结构的问题很少,但尚未得到解答。

在将程序代码解析为 AST 的上下文中,AST 是树还是森林?

这样的简单示例如何出现在 AST 中? 假设我们有一个 var 声明、一个函数声明和一个带有几个赋值的 main 函数。这只是一个例子。

会是这样吗?

                  root

       /           |           \
      /            |            \
    var           func         main
   / | \       /   |   \       /   \
 int x  5    args foo  int   asgn asgn
             / \             / \   /  \
           var var          a   x x    2 
           ... ...

那么,如果我按中缀顺序读取树,我会得到实际的代码序列吗?

已更新。

【问题讨论】:

  • 您是在问关于 AST 的一般问题,还是在问特定版本的 GNU 做什么?
  • 是的,我问的是一般情况。我需要自己实现它,所以我试图理解它的结构。如果我理解正确,AST 应该保留进一步处理所需的所有信息值(ast + 符号表),因为我需要从中构建 GENERIC 树(gcc)。
  • "进一步处理所需的所有信息值" ... AST 无法做到这一点。它代表程序的句法结构,仅此而已。 “进一步处理所需的(信息)”包括符号表、控制流排序、程序元素之间的数据如何流动、数据生命周期的干扰……这些东西都不是由 AST 表示的。 每一个表示都擅长表示具体的事物,而可怕又代表他人。因此有许多信息/程序表示。
  • 您能否提供一些代码(简单的程序,不仅仅是一个表达式或赋值 - 因为我知道如何构建这样一个简单的 AST),它是 AST 表示示例?我会很感激的。
  • stackoverflow.com/questions/6376662/…查看简单Java程序的AST

标签: abstract-syntax-tree


【解决方案1】:

通常,“AST”不包含“实际代码序列”,无论您如何重新排列它。这就是为什么它被称为“抽象”:细节已被删除。它包含足够的信息,基本上可以代表程序文本所说的内容。

具体语法树可以说包含足够的信息来重新生成源;需要努力存储足够的内容以重新生成原始程序,尤其是如果您需要文字格式信息,例如数字基数和分数后尾随零的数量。

信息是按顺序、预顺序或后顺序存储还是对每个节点都不同,这是实施的问题。 (大多数 AST 和 CST 树在按顺序遍历时倾向于匹配程序文本顺序)。

[编辑 2014 年 7 月 3 日以回答有关“单树与森林”的问题]

作为一般规则,人们希望将单个源文件解析为单个 AST。然而,真正的程序有很多有趣的复杂性。例如,C 中的#include 语句引用另一个文件(抽象地扩展到位),Java 中的包引用引用另一个文件。那么,如果一个 single 源文件引用了许多其他源文件,并且解析了单个源文件,那么是否应该为单个源文件生成一个 AST,而不为其他文件生成 AST?

这个问题的答案取决于您正在构建的工具的性质。 C 编译器在原地扩展#include,解析C 文件往往会产生一个 AST。 Java 编译器不会就地扩展包引用,但可能需要解析包源文件以了解其包含的内容;在这种情况下,您往往会得到一个多个 AST,一个用于“主”程序,一个用于它引用的每个包,一个用于它们引用的每个(唯一)包,等等。如果您的工具没有编译,但是想要修改 C 源代码,您可能不想在适当的位置扩展 #include,因此这样的工具将有一个用于主 C 程序的源文件,并为遇到的每个 #include 提供一个源文件。因此,根据您的目的,您的(复杂)解析器可能只生成一个 AST 或一组(通常称为“森林”)。

【讨论】:

    【解决方案2】:

    您可以使用一个有用的 Eclipse 插件消除任何疑问,该插件允许您从代码中的任何位置查看 ast: - 安装插件 - 在源代码中的任何位置定位(光标) - 进入“Ast 视图” - 单击视图的“分层”按钮 - 查看完整的 Ast

    来自谷歌查询搜索“eclipse plugin ast view”的插件链接 P.s.: ast 不是森林而是“树”

    再见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多