Clang is not just a great compiler...
-- Doug Gregor, Apple Inc.
clangは、モダンなコンパイラとして有名であるが、
中間形式である AST を使ったりして静的解析の基板として使えるようにもなっている。
実際に、Apple の Xcode では、Clang を使ってコード補完を実現しているそうだ。
そんな、Clang 使って AST を覗く方法の話。
昔は XML で構文木を吐き出す機能があったらしい
今のバージョンは -ast-print-xml
オプションはない。
-emit-ast
で我慢しろ、らしい。
これで生成される source.ast
ファイルがバイナリ形式だから困ったものである。
AST を解析する方法
オープンソースなので、clang のソースに手を入れるとか
手段はいくらでもあるのだろうけれど、
正攻法は libclang を使ってアクセスするらしい。
最も安直な構文のなぞり方は、下記のように
clang_visitChildren()
で各要素ごとにウォークスルーする。
なお、コンパイルは以下のように。
(Clang でコンパイルしたかったが、なんかうまくリンクが通らなかったので GCC でやった。)
ちなみに使い方は、引数に ast ファイルを渡してやる。
つまり、全体的な使い方としては以下のようになる。
ちょっとした XML を吐こうとすると
XML 出力には libxml2 使って
Makefile は、例えば、
使い方は、前のと同じく
しかし、さすがに自力で XML を吐こうとするとメンドイ。
これでも表示項目足りないくらいだし。
References