libclang の Python binding を使用する 〜導入編〜

最近 libclang の Python binding を使用をしようた Vim プラグインを作成しているのでその覚書としてポツポツ書いていこうかと思います。
ibclang とは Clang が提供している構文解析ツールになります。
この構文解析器は Clang から提供されている Python binding を使用することで比較的簡単に使用することができます。
諸事情により LLVM 3.3 で動作確認していますが、LLVM 3.4 でも基本的な使い方は変わらないはずです。
あと Python はあまり慣れていないので書き方など間違っている箇所があったらすみません。

[Python binding を導入する]

Python binding は Clang のソースコードに付属しています。
ソースファイルはここsvn などから落としてくるとよいでしょう。
この Python binding を Python から使用したい場合は予め $PYTHONPATH に設定しておく必要があります。

$PYTHONPATH=D:/clang/bindings/python

[使用する]

とりあえず、簡単な使い方をしてみます。

[test.cpp]

struct X{
    int value;

    void
    func(){}
};

int
plus(int a, int b){
    return a + b;
}

namespace hoge{
    int
    minus(int a, int b){
        return a - b;
    }
}

int
main(){
    plus(1, 2);
    hoge::minus(3, 5);
    return 0;
}

[main.py]

import sys

import clang.cindex
from clang.cindex import Index
from clang.cindex import Config


def print_node_tree(node):
    print "%s : %s" % (node.kind.name, node.displayname)
    for child in node.get_children():
        print_node_tree(child)

index = Index.create()
tu = index.parse("test.cpp")
print_node_tree(tu.cursor)

[出力]

TRANSLATION_UNIT : test.cpp
TYPEDEF_DECL : __builtin_va_list
STRUCT_DECL : X
FIELD_DECL : value
CXX_METHOD : func()
COMPOUND_STMT : 
FUNCTION_DECL : plus(int, int)
PARM_DECL : a
PARM_DECL : b
COMPOUND_STMT : 
RETURN_STMT : 
BINARY_OPERATOR : 
UNEXPOSED_EXPR : a
DECL_REF_EXPR : a
UNEXPOSED_EXPR : b
DECL_REF_EXPR : b
NAMESPACE : hoge
FUNCTION_DECL : minus(int, int)
PARM_DECL : a
PARM_DECL : b
COMPOUND_STMT : 
RETURN_STMT : 
BINARY_OPERATOR : 
UNEXPOSED_EXPR : a
DECL_REF_EXPR : a
UNEXPOSED_EXPR : b
DECL_REF_EXPR : b
FUNCTION_DECL : main()
COMPOUND_STMT : 
CALL_EXPR : plus
UNEXPOSED_EXPR : plus
DECL_REF_EXPR : plus
INTEGER_LITERAL : 
INTEGER_LITERAL : 
CALL_EXPR : minus
UNEXPOSED_EXPR : minus
DECL_REF_EXPR : minus
NAMESPACE_REF : hoge
INTEGER_LITERAL : 
INTEGER_LITERAL : 
RETURN_STMT : 
INTEGER_LITERAL : 


とりあえず、こんな感じ。
次は Config 周りについてでも。

[Clang]

  • clang++ (LLVM) 3.3