2017-03-06 15 views
0

Clanを使用してASTにアクセスして、特定のソースファイル内の変数とメソッドに関する情報を取得したいと考えています。しかし、私はLibTooling機能を使いたくありません。私は手で、.cppを解析してツリーを取得するメソッドを呼び出すコードに書きたいと思います。私はこれを行う方法を教えてくれるリソースは見つかりません。誰でも助けることができますか?Clangを使用してASTを取得

答えて

0

Clangコンポーネントをコンパイルデータベースで動作させる方法、コンパイラインスタンスを設定する方法などを学ぶことを目標とするなら、Clangのソースコードはリソースです。おそらく、ClangTool::buildASTs()メソッドのソースが適切です。ソースツリーのlib/Tooling /ディレクトリにあるTooling.cppを参照してください。あなたの目標はLibToolingがサポートされていない分析を行うことで、あなただけの最小限の手間でASTを取得したい場合は

、その後、いずれかClangTool::buildASTsまたはclang::tooling::buildASTFromCodeは、サービスのかもしれません。コンパイルオプション、パスのインクルードなどを表現するコンパイルデータベースが必要な場合は、ClangToolの方が優れています。軽量テスト用のスタンドアロンのコードがあれば、buildASTFromCodeは問題ありません。ここでClangToolアプローチの例です:

#include "clang/Tooling/CommonOptionsParser.h" 
#include "clang/Tooling/Tooling.h" 
#include "llvm/Support/CommandLine.h" 
#include <memory> 
#include <vector> 

static llvm::cl::OptionCategory MyOpts("Ignored"); 

int main(int argc, const char ** argv) 
{ 
    using namespace clang; 
    using namespace clang::tooling; 
    CommonOptionsParser opt_prs(argc, argv, MyOpts); 
    ClangTool tool(opt_prs.getCompilations(), opt_prs.getSourcePathList()); 
    using ast_vec_t = std::vector<std::unique_ptr<ASTUnit>>; 
    ast_vec_t asts; 
    tool.buildASTs(asts); 
    // now you the AST for each translation unit 
    ... 

はここbuildASTFromCodeの例です:

#include "clang/Frontend/ASTUnit.h" 
#include "clang/Tooling/Tooling.h" 

    ... 
    std::string code = "struct A{public: int i;}; void f(A & a}{}"; 
    std::unique_ptr<clang::ASTUnit> ast(clang::tooling::buildASTFromCode(code)); 
    // now you have the AST for the code snippet 
    clang::ASTContext * pctx = &(ast->getASTContext()); 
    clang::TranslationUnitDecl * decl = pctx->getTranslationUnitDecl(); 
    ...  
関連する問題