我能够编写一个简单的正则表达式来捕获 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,如果这个问题的解决方案能够说明一行(不需要考虑多行定义)是否是函数定义,那就更好了。
由于学习曲线陡峭,学习整个编译器框架是不可能的,所以我寻找已经使用过编译器工具的东西。
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
。它绝对不适用于所有情况,但它适用于我的情况。