gpt4 book ai didi

将C程序转换为控制流图的Java代码

转载 作者:行者123 更新时间:2023-11-30 20:16:44 24 4
gpt4 key购买 nike

我需要一个java代码来将C程序转换为控制流图。

谁能帮我解决一下吗?

最佳答案

7 月 12 日将是一个很难满足的截止日期,但你可以做到。

如果我自己完成这个项目,以下是我会使用的一般策略:

  1. 预处理输入 C 文件(也称为翻译单元)。这会生成预处理的翻译单元
  2. 将预处理后的翻译单元解析为抽象语法树 (AST)。
  3. 遍历 AST,为每个函数声明创建一个图形节点 n。将(函数名称n)添加到 map 。
  4. 遍历 AST,构建控制流图。考虑如何在控制流图中表示以下特殊情况:
    • 带标签的语句
    • 如果/else
    • if 后面没有 else
    • 转到
    • 开关
    • switch 内的失败案例和 break
    • 循环,例如 do...whilewhilefor
    • 在循环内中断
    • 在循环内继续
    • 返回
    • 常规函数调用
    • 调用函数指针的目标
    • void 函数定义结束(无返回)
    • int main()int main(int, char**) 结束,不需要return
    • 退出
    • 中间值
  5. 输出 DOT format 中的图表.

您可能想使用这个测试程序,我认为它具有所有“特殊”情况:

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

void usage(const char *arg0)
{
fprintf(stderr, "Usage: %s [INTEGER]\n", arg0);
fprintf(stderr, "Dummy program\n");
exit(EXIT_FAILURE);
}

int g_a;

void init()
{
g_a = 3;
}

int return_4()
{
return 4;
}

void uninit()
{
}

int main(int argc, char **argv)
{
if (argc <= 1) {
usage(argv[0]);
}

if (argc > 2) {
printf("You only need to pass one argument.\n");
}
else {
init();
}

const int i = atoi(argv[1]);
int j;
before_switch: j = 0;
switch_i: switch (i) {
case 3:
for(; j < 3; ++j)
printf(".");
case 17:
for(; j < 17; ++j)
printf(".");
if (i == 3 || i == 17)
printf("\n");
case -4:
printf("You picked one of my favorite numbers (17, 3, and -4)!\n");
break;

case -1:
printf("Cleaning up\n");
goto cleanup;

default:
printf("I don't like that number.\n");
}

j = 0;
do_loop_1: do {
if (j++ % 2 == 0)
continue;
if (j == 10)
break;

printf("j is %d.\n", j);
} while(j < 30);

j = 10;
while (j > 0) {
if (4 == return_4())
break;
--j;
}

void (*voidFn)() = &uninit;
voidFn();
init();

cleanup:
uninit();
return EXIT_SUCCESS;
}

我还会使用以下开源库:

  1. JCPP ,C 预处理器的纯 Java 实现,用于预处理翻译单元
  2. ANTLRANTLR C grammar 一起解析
  3. Grappa用于图形数据结构和图形绘制(如果需要)

关于将C程序转换为控制流图的Java代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com