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