1

現在、clang C API を使用して C++ コードのパーサーを構築しています。パーサーはヘッダー ファイルを処理し、定義済みシンボルと不足しているシンボルのリストを生成します (インクルード ディレクティブを無視するため、ヘッダーの内容を厳密に解析します)。私の問題は、次typedefのような未定義の型の引数を取る関数ポインターがある場合です。

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);

AST はSOME_TYPEではなく typedef として解析しますfuncPtrName。に置き換えるSOME_UNDEF_TYPEと、正しくint解析されます。funcPtrName

clang_tokenizeカーソルのすべてのトークンを取得し、関数ポインター名を手動で取得するために使用できると思いclang_getCursorExtentましたが、typedef を指すカーソルでの呼び出しは正しく機能しません (返される範囲は 0,0 です)。

この問題を回避する方法を知っていますか?

4

1 に答える 1

0

翻訳単位内のすべてのトークンのリストを作成し、それをビジター関数に渡すことで、問題を回避することができました。カーソルに到達したら、トークン リストで名前CXCursor_TypedefDeclを検索しtypedef、次のトークンが であるかどうかを確認しました(*もしそうなら、関数ポインタの名前になる の後の最初のトークンを待ちます。

サンプルコードは次のとおりです。

   std::string symbol = clang_getCString(clang_getCursorSpelling(Cursor));

   ...

   case CXCursor_TypedefDecl:
   {
       auto finder = std::find(tokens.begin(), tokens.end(), symbol);
       if (*(finder + 1) == "(")
       {
           auto next = std::find(finder, parserData->tokens.end(), "*") + 1;
           symbol = *next;
       }
       symbolData[symbol] = SymbolInfo{ cursorKind, fileName };
   }
于 2014-06-05T08:18:18.677 に答える