解析C ++以对代码进行一些更改

时间:2011-06-17 17:01:41

标签: c++ parsing

我想编写一个小工具,它接受一个C ++程序(单个.cpp文件),找到“main”函数并为其添加2个函数调用,一个在开头,一个在最后。

如何做到这一点?我可以使用g ++的解析机制(或任何其他解析器)吗?

5 个答案:

答案 0 :(得分:8)

如果要使其稳定,请使用clang's libraries

答案 1 :(得分:6)

正如一些评论者的建议,让我提出我的想法作为答案:

基本上,这个想法是:

... original .cpp file ...

#include <yourHeader>
namespace { 
  SpecialClass  specialClassInstance;
}

SpecialClass类似于:

class SpecialClass {
  public:
    SpecialClass() {
        firstFunction();
    }

    ~SpecialClass() {
        secondFunction();
    }
}

这样,您不需要解析C ++文件。由于您声明了一个全局变量,因此它的构造函数将在main启动之前运行,其析构函数将在main返回后运行。

缺点是你不了解你的全局构建时间与其他人相比的相对顺序。因此,如果您需要保证调用firstFunction 在整个程序中的其他任何构造函数之前,你运气不好。

答案 2 :(得分:2)

我听说GCC解析器既难以使用,也更难以在不调用整个工具链的情况下使用。我会尝试使用clang C / C ++解析器(libparse),并在this问题中链接教程。

答案 3 :(得分:2)

main()的开头和main()的末尾添加一个函数是一个坏主意。如果有人在中间拨打return怎么办? 更好的想法是在main()的开头实例化一个类,并让该类析构函数执行最后调用的调用函数。这将确保始终调用该函数。

答案 4 :(得分:1)

如果您可以控制您的主程序,您可以破解脚本来执行此操作,这是迄今为止最简单的方法。只需确保插入点是显而易见的(奇怪的注释,所需的令牌放置,您选择)和独特(包括禁止一般编码实践,如果您必须,以确保您需要的唯一性是真实的)。然后一个愚蠢的字符串黑客工具来读取源,找到唯一的标记,并插入您想要的调用将工作正常。

如果主程序的源代码来自其他来源,并且您没有控制权,那么为了做到这一点,您需要一个完整的C ++程序转换引擎。你不想自己构建它,因为只需要C ++解析器就可以做出巨大努力。其他人在这里提到了Clang和GCC作为答案。

另一种选择是我们的DMS Software Reengineering Toolkit及其C ++前端。 DMS使用其C ++前端,可以解析代码(用于各种C ++方言),构建AST,执行全名/类型解析以确定所有符号的含义/定义/使用。它提供了程序和源到源的转换,以启用AST的更改,并可以使用原始注释重新生成可编译的源代码。