用C#解析C头文件

时间:2014-07-11 22:08:06

标签: c# parsing

我正在使用Visual Studio C#,我需要解析C头文件以仅提取有关其中包含的函数声明的信息。对于每个函数,我需要名称,返回类型及其参数。如果可能的话,我希望参数按照它们在函数声明中出现的顺序排列。 我在网上看过有关使用视觉工作室标签或Exhuberant Ctags等的内容。但是从我收集到的内容中,这些并不是真正的选项,让我用C#代码执行C#程序的解析(我可能是错误?)。我也查看了相关问题的所有其他答案,但它们似乎并不适用于我的情况(我可能只是愚蠢)。 如果我至少可以获得代表函数声明的所有代码行,那么我有一个良好的开端并且可以自己手工解析其余部分。 提前致谢

1 个答案:

答案 0 :(得分:2)

解析"解析"深层意义上的C(头文件)文件并获取函数声明的类型信息,实际上你需要:

  • 一个完整的预处理器(包括供应商添加的pecaddillos,MS在其标题中有一些非常奇怪的东西),
  • 感兴趣的C语言的完整(语法)解析器/ AST构建器(没有" C"以及供应商在此编译器版本中提供的内容)
  • 完整符号表构造(因为typedef是实际感兴趣类型的别名)

许多人会建议"编写自己的解析器(针对C)"。大多数人都没有做到这一点;它做了很多工作并且比他们理解的更好。如果您不是从生产级别的机器开始,那么您无法通过真正的C头文件而无需修复所有内容。

解析普通C很难;考虑解析模糊短语的问题

 T*X;

A classic parser cannot parse this without additional hackery

通常,您也无法自行解析C头文件。您需要具有包含它的源代码上下文(通常包括编译器命令行),或者特定头文件中的typedef,预处理器条件和宏将是未定义的,因此无法扩展到编译器通常看到的有效C中。

您最好先获得预先存在的预测试机器,以便为您完成此操作。考虑到Clang是一种选择,虽然我不确定它是否处理MS头文件。 GCC是一种选择,但它真的,真的想成为一个编译器,而不是你当地友好的C源代码分析工具,而且我不确定它对C语言的MS方言的支持。我们的DMS软件再造工具包具有以上所有C语言的各种MS方言。

选择了一个可以实际解析此类标头的工具后,您可能希望使用收集的标头信息。你对自己想要完成的事情含糊不清。在提到C#和C之后,提示您要从C#代码调用C程序,因此需要为C代码生成C#等效API。为此,您将需要机器来操纵所提供的类型信息,并构建"文本"对于C#声明。为此,您可能会发现您还需要其他支持工具来完成这一部分。在这里,GCC是一个完整的非首发;它不会为你提供额外的帮助。 Clang和DMS都是设计用于定制工具建筑机械的库。

当然,根据您要处理的头文件文本数量,这可能都没有实际意义;它只是一个头文件,手动执行可能是最简单的。你建议你愿意这样做("可以手工解析......")。在这种情况下,您真正​​需要做的就是运行预处理器并解释输出。我相信你可以使用GCC和Clang甚至MS编译器的命令行开关;我知道DMS可以做到这一点。有关易于使用的选项,请参阅How do I see a C/C++ source file after preprocessing in Visual Studio?