我已经创建了一个树转储,其描述如下:How can I dump an abstract syntax tree generated by gcc into a .dot file?这个虚拟脚本:
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
语句是什么意思?
答案 0 :(得分:1)
您链接的答案显示了如何从GCC调试转储中获取Control Flow Graph。因此,您的图像实际上没有显示语法树。
GCC C前端没有经典意义上的抽象语法树。在解析过程中,许多语法构造会降低,通常会降到一堆goto
中。例如,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
节点像C if
语句的打印方式)中看到。但是,该通过没有生成.dot
文件。一旦编译过程进入中间端,它就是GIMPLE,而GIMPLE(作为SSA变体)根本无法使用for
和if
语句等高级语言构造来表示控制流。>
Clang具有更传统的AST,由clang -Xclang -ast-dump
打印。它仍然不是Graphviz的合适输入,但至少数据在那里。如果您的目标是了解GCC,请查看C ++前端,该前端在解析器中保留了更丰富的结构。