2010-06-20 69 views
-1

我需要用于将C程序转换为控制流程图的java代码。用于将C程序转换为控制流程图的Java代码

任何人都可以帮助我吗?

+0

你有使用Java,或者仅仅是在JVM上运行的东西吗? – 2010-06-20 15:58:56

+0

我必须使用Java – 2010-06-20 16:13:40

+0

你有什么帮助?创建一个解析器,然后创建语义分析器,然后构建一个流程图。 – Drakosha 2010-06-20 20:00:06

回答

1

7月12日th将会是一个艰难的最后期限,但你可以做到。

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

  1. 预处理输入C文件(也称为翻译单元)。这会生成预处理的翻译单元
  2. 将预处理翻译单元解析为抽象语法树(AST)。
  3. 遍历AST,为每个函数声明创建一个图节点n。将(函数名称,n)添加到地图。
  4. 遍历AST,构建控制流图。考虑你将如何来表示控制流图以下,特殊情况:
    • 标记语句
    • if/else
    • if不跟else
    • goto
    • switch
    • 落空的情况下并在switchbreak
    • 循环例如do ... while,whilefor
    • 一个环内的环
    • continuebreak
    • return
    • 普通函数调用
    • 调用函数指针void函数定义的
    • 结束(无return
    • 的目标int main()int main(int, char**)的结尾,不需要return
    • exit
    • 中间值
  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. ANTLR用于解析以及ANTLR C grammar
  3. Grappa为图形数据结构和图形绘制(如果需要)
+1

你的例子并不包括你可以用C写的讨厌的东西。把一个标签放在一个块的中间是完全合法的,并且**从块外面转到它是完全合法的。将案例结构不合理的构建切换语句放入是完全合法的。在海湾合作委员会,你有间接的。 C的大多数版本都允许setjmp。所有这些都可以使看起来像结构化程序的东西变成意大利面条。 – 2010-06-22 14:19:42

+0

@Ira:是的。我已经忘记了C的这些特征。但是,希望遵循这个策略将产生一个能够处理这些额外情况的程序。 – 2010-06-23 23:31:48