Ответ, который вы связываете, показывает, как получить График потока управления из дампов отладки GCC. Таким образом, ваше изображение на самом деле не показывает синтаксическое дерево.
Внешний интерфейс 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 ++, который сохраняет более богатую структуру в синтаксическом анализаторе.