私はlibclangのpythonバインディングを使用していますが、この問題はPythonバインディングではなくlibclangによって発生していると思います。私はobject.h
の翻訳単位のASTを訪問すればclangは私の.hファイルをスタンドアロンで解析できません
私は、ヘッダーobject.h
#ifndef OBJECT_H
#define OBJECT_H
class Object {
public:
int run();
};
#endif
と実装object.cpp
#include "object.h"
int Object::run() {
int a = 0;
return a*a;
}
を持って、最後のASTノードはVAR_DECL
class Object
あると、それはそれです。それはpublic:...
部分を訪問しません。私が構文を直接チェックするためにclangを使用すると、私のヘッダファイルに関する文句は間違っています。
$ clang -Xclang -ast-dump -fsyntax-only object/object.h
object/object.h:4:1: error: unknown type name 'class'
class Object {
^
object/object.h:4:13: error: expected ';' after top level declarator
class Object {
^
;
TranslationUnitDecl 0x7f816102d2d0 <<invalid sloc>>
|-TypedefDecl 0x7f816102d7d0 <<invalid sloc>> __int128_t '__int128'
|-TypedefDecl 0x7f816102d830 <<invalid sloc>> __uint128_t 'unsigned __int128'
|-TypedefDecl 0x7f816102db80 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]'
`-VarDecl 0x7f816102dbf0 <object/object.h:4:1, col:7> Object 'int' invalid
2 errors generated.
私はobject.cpp
のASTをダンプするために打ち鳴らすを使用している場合、私はそのエラーを持っていません。
$ clang -Xclang -ast-dump -fsyntax-only object/object.cpp
TranslationUnitDecl 0x7fc6230302d0 <<invalid sloc>>
|-TypedefDecl 0x7fc623030810 <<invalid sloc>> __int128_t '__int128'
|-TypedefDecl 0x7fc623030870 <<invalid sloc>> __uint128_t 'unsigned __int128'
|-TypedefDecl 0x7fc623030c30 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]'
|-CXXRecordDecl 0x7fc623030c80 <object/object.h:4:1, line:7:1> class Object definition
| |-CXXRecordDecl 0x7fc623030d90 <line:4:1, col:7> class Object
| |-AccessSpecDecl 0x7fc623030e20 <line:5:1, col:7> public
| `-CXXMethodDecl 0x7fc623030ea0 <line:6:3, col:11> run 'int (void)'
`-CXXMethodDecl 0x7fc62307be10 parent 0x7fc623030c80 prev 0x7fc623030ea0 <object/object.cpp:3:1, line:6:1> run 'int (void)'
`-CompoundStmt 0x7fc62307c058 <line:3:19, line:6:1>
|-DeclStmt 0x7fc62307bf78 <line:4:3, col:12>
| `-VarDecl 0x7fc62307bf00 <col:3, col:11> a 'int'
| `-IntegerLiteral 0x7fc62307bf58 <col:11> 'int' 0
`-ReturnStmt 0x7fc62307c038 <line:5:3, col:12>
`-BinaryOperator 0x7fc62307c010 <col:10, col:12> 'int' '*'
|-ImplicitCastExpr 0x7fc62307bfe0 <col:10> 'int' <LValueToRValue>
| `-DeclRefExpr 0x7fc62307bf90 <col:10> 'int' lvalue Var 0x7fc62307bf00 'a' 'int'
`-ImplicitCastExpr 0x7fc62307bff8 <col:12> 'int' <LValueToRValue>
`-DeclRefExpr 0x7fc62307bfb8 <col:12> 'int' lvalue Var 0x7fc62307bf00 'a' 'int'
打ち鳴らすは、構文解析を行い、その後、一緒object.h
object.cpp
を組み合わせたように思えます。 その場合、object.cpp
int Object::run() {
の最後の行にあるObject
のastノードを取得するにはどうすればよいですか?そのためのastノードがありますか?また、私がobject.cpp
でrun()
方法を訪れたときのようにたくさんの混乱
、それが現在の場所がobject.cpp
であるが、程度はobject.h
であると言うだろう。エクステントは正確にはどういう意味ですか? libclang APIドキュメント以外の簡単なチュートリアルドキュメントはありますか?
エクストラクランツールはどうですか?たとえばclang-queryのように、C++フラグを設定するオプションはありません – thisEric