https://gist.github.com/tonyseek/4161012
からコードを拝借する。 以下のように3つファイルを作る。
astviz:
#!/usr/bin/env sh SCRIPT_PATH=$(dirname $0) gcc -o $1 $1.c -fdump-tree-original-raw $SCRIPT_PATH/pre.awk $1.c.* | $SCRIPT_PATH/treeviz.awk > $1.dot dot -Tpng $1.dot -o $1.png
pre.awk:
#!/usr/bin/env -S gawk -f /^[^;]/{ gsub(/^@/, "~@", $0); gsub(/( *):( *)/, ":", $0); print; }
treeviz.awk
#!/usr/bin/env -S gawk -f #http://alohakun.blog7.fc2.com/?mode=m&no=355 BEGIN {RS = "~@"; printf "digraph G {\n node [shape = record];";} /^[0-9]/{ s = sprintf("%s [label = \"{%s | {", $1, $1); for(i = 2; i < NF - 1; i++) s = s sprintf("%s | ", $i); s = s sprintf("%s}}\"];\n", $i); $0 = s; while (/([a-zA-Z]+):@([0-9]+)/){ format = sprintf("\\1 \\3\n %s:\\1 -> \\2;", $1); $0 = gensub(/([a-zA-Z]+):@([0-9]+)(.*)$/, format, "g"); }; printf " %s\n", $0; } END {print "}"}
$ echo "int main() { return 0; }" > a.c $ ./astviz a
a.png
できた。
ちなみに、 astvizの最後の行を
$SCRIPT_PATH/pre.awk $1.c.* | $SCRIPT_PATH/treeviz.awk | dot -Tx11
にすれば中間ファイルを作らずにウィンドウ上にグラフを表示できて嬉しい。