1

我目前正在使用 clang C API 为 C++ 代码构建解析器。解析器将处理一个头文件并为其生成一个已定义符号和缺失符号的列表(它忽略包含指令,因此它将严格解析头文件的内容)。我的问题是,如果我有typedef一个函数指针,它接受一个未定义类型的参数,例如:

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);

AST 解析SOME_TYPE为 typedef 而不是funcPtrName. 如果我替换SOME_UNDEF_TYPEint,它会正确解析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 回答