如何捕获 C++ 函数声明/原型的所有参数名称?

问题描述 投票:0回答:1
我需要捕获一些C++函数原型的参数的所有名称。

我能够编写一个简单的正则表达式来捕获 C 函数(只是为了玩玩,我

不打算在最终解决方案中使用正则表达式), 但它不适用于更复杂的声明。

对于简单的函数来说这很容易,像这样:

void hello(int a);
但是接下来是 C++。这是 CUDA 的一个复杂示例:

extern __host__ cudaError_t CUDARTAPI cudaStreamGetCaptureInfo(cudaStream_t stream, enum cudaStreamCaptureStatus *captureStatus_out, unsigned long long *id_out __dv(0), cudaGraph_t *graph_out __dv(0), const cudaGraphNode_t **dependencies_out __dv(0), size_t *numDependencies_out __dv(0));
这是 C++ 系列的野兽(我不是粉丝)。

我想捕捉以下内容:

流、captureStatus_out、id_out、graph_out、dependency_out、numDependency_out

我怎样才能实现这个目标?我使用的是 Python,但任何工具、编译器或语言都可以。

我不想粗鲁,但我不是在寻找类似的答案:“不要使用正则表达式,使用 clang”或其他一些非常大和复杂的编译器。对于正则表达式来说,这显然“不是”问题。至少发布一些指向人们可以开始阅读解决方案的地方。

奖励:假设使用 AST,如果这个问题的解决方案能够说明一行(不需要考虑多行定义)是否是函数定义,那就更好了。

由于学习曲线陡峭,学习整个编译器框架是不可能的,所以我寻找已经使用过编译器工具的东西。
c++ parsing
1个回答
0
投票
Doxygen 是最佳选择。我生成头文件的 xml,然后使用

xml.etree.ElementTree

遍历树,查找

memberdef

kind="function"
。
Doxygen 生成函数名称、参数名称和类型。
示例:
<type>__host__ cudaError_t CUDARTAPI</type>
 <definition>__host__ cudaError_t CUDARTAPI cudaStreamGetCaptureInfo</definition>
<name>cudaStreamGetCaptureInfo</name>
<param>
   <type>cudaStream_t</type>
   <declname>stream</declname>
</param>

但是 Doxygen 不喜欢
__dv
的东西,所以我只是手动清理头文件,使用正则表达式删除

__dv(arg)

arg
 。它绝对不适用于所有情况,但它适用于我的情况。

© www.soinside.com 2019 - 2024. All rights reserved.