tokuhirom's Blog

Clang.pm で C/C++/Objective-C をパースする!!

https://github.com/AlexBio/p5-Clang
https://metacpan.org/release/Clang

Clang.pmという謎のライブラリをALEXBIO氏が CPAN にだしていたので、つかってみた。

まずは、ライブラリを

sudo aptitude install libclang-dev
cpanm Clang -nv

としてインストールします。

int main() {
    puts("Hello, world!");
    return 0;
}

というソースを hello.c という名前で用意。

use v5.16;
 
use Clang;
 
my $index = Clang::Index->new(1);
 
my $tunit = $index->parse('hello.c');
my $nodes = $tunit->cursor->children;
 
foreach my $node (@$nodes) {
    printf("%s %s\n", $node->spelling, $node->kind->spelling);
}

というように Clang::Index をたたくようにすると

以下のような出力をえる。

hello.c
__va_list_tag StructDecl
__va_list_tag TypedefDecl
__builtin_va_list TypedefDecl
main FunctionDecl

ドキュメントをよんだかんじでは、どうやら現状ではfunction/typedef/structの一覧がとれるところまでしか実装されてない様子。本来は FunctionDecl の中のパーズツリーもとれるとおもうのだが、そのメソッドが現在実装されていない。今後に期待といったところ。

もうちょっと整備されれば、gonzui のインデックスや、メトリックスなどの用途につかえそうですね。