我创建了一个树转储,如下所述:如何将 gcc 生成的抽象语法树转储到 .dot 文件中? https://stackoverflow.com/questions/15800230/how-can-i-dump-an-abstract-syntax-tree-generated-by-gcc-into-a-dot-file/54059710#54059710对于这个虚拟脚本:
int fact(int n) {
if (n<=1) {
return 1;
}
return n * fact(n-1);
}
int main(void) {
int a = 4;
int res = fact(a);
return res;
}
我得到的图像是:
据我所知,gcc 并不是学习 AST 表示的最佳方法。但无论如何,了解图像内容的含义会很高兴。
特别是什么%
这里的标志意味着和FREQ:0
陈述?
您链接的答案显示了如何获取控制流程图 https://en.wikipedia.org/wiki/Control_flow_graph来自 GCC 调试转储。所以你的图像实际上并没有显示语法树。
GCC C 前端没有经典意义上的抽象语法树。许多句法结构在解析过程中被降低,通常是一堆goto
s。例如,c_finish_loop
有这个:
/* If we have an exit condition, then we build an IF with gotos either
out of the loop, or to the top of it. If there's no exit condition,
then we just build a jump back to the top. */
exit = build_and_jump (&LABEL_EXPR_LABEL (top));
if
语句变成COND_EXPR
节点。您可以在.original
转储(其中COND_EXPR
节点打印得像 Cif
陈述)。但没有.dot
从该通道生成的文件。一旦编译过程进入中端,它就是 GIMPLE,而 GIMPLE(作为 SSA 变体)并不表示使用高级语言结构的控制流,例如for
and if
根本没有声明。
Clang 有一个更传统的 AST,由clang -Xclang -ast-dump
。它仍然不适合 Graphviz 的输入,但至少数据在那里。如果您的目标是了解 GCC,请查看 C++ 前端,它在解析器中保留了更丰富的结构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)