【发布时间】: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