1

如果我有一个 C 源文件,并且我想在一个函数中找到一个特定的局部变量并使其成为全局变量 - 所以另一个工具能够处理 C 文件(我没有编写的工具)什么是最简单的方法做这个?我正在考虑使用正则表达式,但即使这样也有它自己的问题。这有点像用 Java 编写一个迷你 C 解析器.. 很多工作:S

是否有任何库可以帮助使这更容易?

例如,假设我想将变量“i”变成一个全局变量。用户将指定函数名称和变量名称(但不指定变量的类型 - 即“int”)。

我可以使用正则表达式来查找函数 - 当然。但是从那里我真的不知道最好的方法是什么?... CDT插件有帮助吗?

例子:

 /* 
  * add.c
  * a simple C program
  *
  */

#include <stdio.h>
#define LAST 10

int main()
{
    int i = 0;
    int sum = 0;

    for ( i = 1; i <= LAST; i++ ) {
      sum += i;
    } /*-for-*/
    printf("sum = %d\n", sum);

    return 0;
}

转换成:

 /* 
  * add.c
  * a simple C program
  *
  */

#include <stdio.h>
#define LAST 10

int i = 0;

int main()
{

    int sum = 0;

    for ( i = 1; i <= LAST; i++ ) {
      sum += i;
    } /*-for-*/
    printf("sum = %d\n", sum);

    return 0;
}
4

3 回答 3

2

如果你只做一些简单的例子,你可以用 Perl 或一些 java regex 来破解它。它不能在复杂的程序上可靠地工作,因为您需要一个真正的解析器。

我们的DMS Software Reengineering Toolkit及其C 前端可以非常可靠地用于此目的。

DMS 提供通用程序分析和转换功能,由编程语言描述参数化。DMS 的 C Front 向 DMS 解释了 C 的精确语法(对于 C 的各种方言,包括 GCC 和 MS);它实际上提供了一个完整的解析器,生成抽象语法树(反之亦然:来自 AST 的 C 代码生成器)这允许 DMS 准确读取 C 源文件,包括预处理。

使用 AST 形式的解析代码,您可以构建 DMS 函数和/或编写模式来查找函数定义,特别是您的目标变量。然后可以使用 DMS 代码或交替源到源的转换将变量从函数中取出,和/或插入代码以跟踪该变量的状态变化,以便可以看到它。

因此,通过 DMS 和一些自定义代码,您可以达到您想要的效果。您提供的示例使用 DMS 可能非常简单,但学习曲线仍然很长;DMS 很复杂,因为它处理的语言很复杂,您必须学习如何使用它。所以,对于新手来说,这不是一个下午的练习。

注意:您将希望对预处理程序执行此操作(否则您通常无法可靠地解析它们)。所以,这应该是你在编译之前做的事情,不应该成为最终代码的一部分。

如果要进行永久性代码更改,则需要解析未预处理的代码;这真是太难了。只要预处理器指令是“结构化的”,DMS 的 C 前端就可以做到这一点;其中大约 95% 是。所以现在你遇到了一个新问题:要么修复非结构化文件(一次性手动更改),要么拒绝“运气不好”无法解析的文件。

您可以使用 GCC 而不是 DMS;毕竟它有一个经过很好测试的 C 解析器。但是,它不会帮助您生成修改后的 C 代码。另一种选择是 Clang,它正在迅速成为一个很好的选择。我认为它会解析 C++;不太确定 C 或特别是您的最终用户可能使用的 C 方言(您没有说)。它有像 DMS 这样的 AST,以及一种为可能有效的代码生成“补丁”的方案。

于 2012-07-20T19:12:26.383 回答
1

即使您能够想出一种方法来进行此类转换,我认为这也不是一个好主意。该程序将不会保持不变,因为您在构建和破坏中移动。此外,并非所有类型都是默认可构造或可复制的,因此通常无法进行转换。

您是否只对几个简单的类型感兴趣?然后将其作为解决方案的一部分。是否生成了原始代码?否则,您怎么能相信仅通过名称来识别本地对象?相同的名称也可用于不同类型的对象。

于 2012-07-20T19:04:00.873 回答
1

我首先需要的是一个完整的规范,说明何时需要,为什么需要,以及如何确定何时安全这样做,而不会对程序语义产生不利影响。这是一个非常糟糕的主意。显然,那些给你分配任务的人不知道实现的复杂性,这是巨大的,或者不利的语义影响。我猜他们因此也无法提出适当的规范,这最终会让你失望。

我也会提请他们注意这次讨论,尤其是 Ira Baxter 的评论。我曾经以构建编译器为生。在论坛上学习或询问不是一项任务。

于 2012-07-21T05:17:23.597 回答