如何可以解析使用铛API来获取函数指针名函数指针的类型定义?(How can I parse a t

2019-10-20 05:51发布

我目前正在建设使用铛C API C ++代码分析器。 解析器将处理头文件和生成为其定义和丢失的符号的列表(它忽略包含指令,所以将解析报头的严格的内容)。 我的问题是,如果我有一个typedef为一个函数指针这需要一个未定义的类型,诸如一个参数:

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);

AST的解析SOME_TYPE作为类型定义,而不是funcPtrName 。 如果我更换SOME_UNDEF_TYPEint ,它分析funcPtrName正确。

我以为我可以使用clang_tokenize以获取光标的所有令牌和手动获取函数指针的名字,但调用clang_getCursorExtent上的光标指向的typedef不能正常工作(返回的范围是0,0)。

你知道解决这个问题的任何方式?

Answer 1:

我还是设法通过建立在翻译单元中的所有令牌的列表,并传递一个解决这个问题交给访问者功能。 当我到达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 };
   }


文章来源: How can I parse a typedef for a function pointer using clang API to get the function pointer name?