首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从c++文件中提取信息

从c++文件中提取信息
EN

Stack Overflow用户
提问于 2014-07-21 09:20:46
回答 1查看 1.2K关注 0票数 1

我知道这个问题一定有点不清楚,但我会尽力解释我的需求。

首先,我现在是一个见习开发人员,现在我正在实习,我的老板想让我创建一个基于代码的文档生成器。

基于代码?的文档生成器

文档生成器是一个程序,它将读取一个c++文件,并从这个c++文件中检索最多的信息,包括声明的变量和函数,并以人类可读的格式(表)显示它们。

示例:

代码语言:javascript
复制
#include <iostream>

using namespace std;

int returnANumber(int argNumber)
{
    int i = 0;
    i = argNumber;
    return argNumber;
}

int main()
{
    returnANumber(70);

    return 0;
}

这是一个c++文件示例,程序将读取和检索所有信息,在本例中是函数的名称(ReturnANumber)、变量(I)、使用指令(Iostream)。

作为第一种方法,我想使用REGEX,并进行匹配,例如:

代码语言:javascript
复制
data-type word ( data-type word);

使用函数声明,但需要管理的情况很多,例如在静态类中的方法声明中.:

代码语言:javascript
复制
data-type static word (data-type word);

在这里,REGEX是一个非常困难的解决方案,我担心是否还有其他解决方案可供使用?有什么帮助吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-07-21 10:12:50

如前所述,您的问题似乎要求您自己读取C++源文件,并提取文档。一般来说,这是不可能的: C++允许宏,这实际上可以对原始文本进行任意编辑以生成有效的C++源代码。C++还允许#include指令,这些指令获取准确解释类型所需的附加信息。面对这些情况,你无法提取好的信息。

所以你有两个选择:

  • “分析”单个文件,并在面对这些问题时提取您所能提取的内容。我在这里草率地使用了“解析”这个词,因为在存在宏和包含的情况下,程序源代码本身并不是有效的C++。在这种情况下,正则表达式可能会做得和你希望的一样好。不要指望它会做得很好;C++是一种很难解析的语言,而regexes不处理上下文无关的解析,所以这个方案中的漏洞将是无尽的和痛苦的。Doxygen uses as a default "bad parsing" to do this kind of "parse"ing for many languages, see additional note below
  • 以编译器的方式解析单个文件,使用完整的预处理功能以编译器的实际方式获取程序文本。这需要工具来处理所有预处理器指令,包括编译器命令行中的任何指令(通常)。编译器生成完整的符号表,其中包含要提取的信息。为此,您需要有一个完整的编译器前端。你没有精力自己造一个。

后者的一些选择是:

  • Clang/LLVM
  • 爱迪生设计集团C++前端
  • 我们的DMS软件重组工具包。
  • GCC (可能是衍生工具GCCXML)

设置其中的每一个,并提取您想要的信息,都是一项相当大的练习。要直接使用它们,您必须了解每个工具,以及一般的编译器技术(解析、符号表),然后您必须在这些工具内部提供的生态系统中定制代码。如果你对他们不熟悉的话,这会让你花很长的时间来学习。

Clang/LLVM是开放源码软件,用C++编码。我不知道它处理C++的微软方言有多好。我的理解是,现在code使用Clang来处理C++源代码;这可能是获取这些信息的最简单的方法,特别是如果您只需要预先格式化的“一些文档”。但是,这违反了你的“从头开始构建一个工具”的格言。

EDG是一个商业前端,广泛应用于许多生产C++编译器中。它是可供研究的(也许你正在做的事情可以被分类,但如果你是商业机构,我怀疑它);我认为它是用C编码的。

DMS是商业化的,但有研究许可选项;编码是结合涉及BNF、属性语法和并行编程语言PARLANSE的特定领域语言完成的。DMS通过C++11和C++14来处理GCC和MS的方言。

GCC是用C语言编写的,但真的,真的很想成为编译器,并且会抵制你为达到你的目的而做出的努力。然而,其他人以前和GCC在一起,他们在上面构建了GCCXML,它至少提取了一些您想要作为XML文件的信息;如果您想要轻松地以您可以操作的形式获取这些信息,这可能是最好的选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24861571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档