2017-07-11 2 views
1

私はClang Lexerライブラリを使ってトークンの場所(特に名前空間宣言の左中括弧)を探しています。私のアイデア(NamespaceDeclにはメソッドがないため)は、名前空間宣言の開始後に最初の左中括弧の位置を見つけることでした。しかし、Lexer APIを見ると、私はASTを訪れている間これを行う簡単で簡単な方法を見つけることができないようです。任意の提案/代替コードを再解析するような劇的な何かをする必要はありませんか?Clang ASTのSourceLocationの後に文字のSourceLocationを見つける方法はありますか?

答えて

0

ここにブレースを見つける方法があります。私のテストでは、名前付きの名前空間と匿名の名前空間の両方で動作します。 next_locがNOPQ 1、COL 18行目に対応することになる

namespace NOPQ { 
    void f(int){} 
} 

namespace 
    ABCD 
    { 
    void g(float){} 
} 

namespace { 
    void h(int){} 
} 

ような宣言で

// Assuming ns_decl is pointer to the NamespaceDecl 
// sm is reference to the SourceManager 
... in addition to the usual headers: 
#include "clang/Basic/TokenKinds.h" // for clang::tok 
#include "clang/Lex/Lexer.h"   // for Lexer 
... 
    clang::LangOptions lopt; 
    bool skipNewLines = false; 
    SourceLocation locToUse = ns_decl->isAnonymousNamespace() ? 
    ns_decl->getLocStart() : ns_decl->getLocation(); 
    SourceLocation next_loc(
    clang::Lexer::findLocationAfterToken(
     locToUse,clang::tok::l_brace, sm,lopt,skipNewLines)); 

。 7行目、ABCDの列7、匿名のnsの11行目、12行目。

+0

素晴らしく、ありがとう。私はちょうどそれがgetLocStart()と同じであると想定しているので、おそらくgetLocation()を取り巻くドキュメントがもう少しあるはずです。また、フォローアップの質問として、私は(そしてこの質問を読んでいる他の人たちも)いつか将来起こるでしょう:これを一般的にどうすればいいですか?言い換えれば、場所の後で特定のトークンの最初の位置を探したい場合、Lexerを使ってそのようにするにはどうすればよいですか? – srujzs

+0

他の人にとっては、それは上記と全く同じです。 – srujzs

関連する問題