寻找C++代码解析器以查看所有签名。

5

我正在寻找一个能够提取所有函数和方法及其签名的c++解析器。有这样的东西吗?

我看了一下gccxml,但它无法使用命名空间,并且只有头文件时也不好用。


顺便说一句,过去两年中,作为我的副业项目之一,我编写了一个解析器,可以从“类、命名空间、内部类”等中提取方法/函数签名。我希望有一天能将其商业化。 - iammilind
@iammilind:我专注于让金钱变为现实。目前还没有明确的结果。 - sehe
@sehe 是什么意思?你也写了类似的东西吗?那么我所说的不仅仅是一个解析器。这是一个自动垃圾回收器项目,其中包括提取指针、类、命名空间、函数/方法等签名的部分。 - iammilind
你在说什么?当然,gccxml可以处理和理解命名空间,你所说的“只有头文件存在时不好”是什么意思? - Nordic Mainframe
4个回答

4

最明显的选项:

  1. ctags
  2. cscope

这是GCC手册的一个示例:

-fdump-noaddr -fdump-unnumbered -fdump-translation-unit[-n] -fdump-class-hierarchy[-n] -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline
           -fdump-statistics -fdump-tree-all -fdump-tree-original[-n] -fdump-tree-optimized[-n] -fdump-tree-cfg -fdump-tree-vcg -fdump-tree-alias -fdump-tree-ch -fdump-tree-ssa[-n] -fdump-tree-pre[-n] -fdump-tree-ccp[-n] -fdump-tree-dce[-n]
           -fdump-tree-gimple[-raw] -fdump-tree-mudflap[-n] -fdump-tree-dom[-n] -fdump-tree-dse[-n] -fdump-tree-phiopt[-n] -fdump-tree-forwprop[-n] -fdump-tree-copyrename[-n] -fdump-tree-nrv -fdump-tree-vect -fdump-tree-sink -fdump-tree-sra[-n]
           -fdump-tree-fre[-n] -fdump-tree-vrp

此外,还有一个gccxml后端与之对应。

1

如果我没记错的话,Clang编译器显然具有执行此操作的功能,甚至还有一个API可以访问解析器生成的代码树。


1
有的。CLang 生成代码的 AST(抽象语法树),并提供了一个 ConsumerAST 基类来访问它。 - Matthieu M.
我更倾向于使用libclang(http://llvm.org/devmtg/2010-11/Gregor-libclang.pdf),但那也应该可以工作。 - Milan
libclang是C-API。如果您可以访问C ++,则可以直接进行更完整的信息交互,因为某些功能需要时间才能移植到C-API。对于简单的声明之类的简单事情,它应该是完全适用的,尽管可能不太适合,因为C代码确实需要一定的努力。 - Matthieu M.

1

您可以使用abi-compliance-checker工具的-dump选项来解析您的头文件中函数和方法的签名:

abi-compliance-checker -lib NAME -dump DESC.xml -headers-only -stdout > api.dump

XML描述符(DESC.xml)如下:

<version>
    VERSION
</version>

<headers>
    /path(s)/to/headers/
</headers>

该工具的工作原理如下:

  1. 使用在输入XML描述符中指定的头文件和一组自动生成的-I...选项调用GCC;
  2. 解析GCC生成的AST dump;
  3. 生成Data::Dumper或XML格式的函数签名和类型定义(如果提供了额外的-xml选项)。

bzlib.h头文件中int BZ2_bzRead(int *bzerror, BZFILE *b, void *buf, int len)函数的示例签名如下:

'228' => { 'Header' => 'bzlib.h', 'Line' => '160', 'Param' => { '0' => { 'algn' => '4', 'name' => 'bzerror', 'type' => '30' }, '1' => { 'algn' => '4', 'name' => 'b', 'type' => '16' }, '2' => { 'algn' => '4', 'name' => 'buf', 'type' => '68' }, '3' => { 'algn' => '4', 'name' => 'len', 'type' => '41' } }, 'Return' => '41', 'ShortName' => 'BZ2_bzRead' },

0
你可以尝试在gcc上设置save-temps标志来编译你的代码,这将使gcc输出带有宏展开和完整签名的文件。这些文件是.ii文件。

这将几乎产生与头文件相同的输出,但我需要一个易于提取给其他程序使用的解析输出。 - develhevel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接