-1
A
回答
1
7月12日th将会是一个艰难的最后期限,但你可以做到。
这里是如果我完成这个项目我自己,我会使用的一般策略:
- 预处理输入C文件(也称为翻译单元)。这会生成预处理的翻译单元。
- 将预处理翻译单元解析为抽象语法树(AST)。
- 遍历AST,为每个函数声明创建一个图节点
n
。将(函数名称,n
)添加到地图。 - 遍历AST,构建控制流图。考虑你将如何来表示控制流图以下,特殊情况:
- 标记语句
if
/else
if
不跟else
。goto
switch
- 落空的情况下并在
switch
break
。 - 循环例如
do
...while
,while
和for
。 - 一个环内的环
continue
内break
return
- 普通函数调用
- 调用函数指针
void
函数定义的 - 结束(无
return
) - 的目标
int main()
和int main(int, char**)
的结尾,不需要return
exit
- 中间值
- 输出在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;
}
我也可以使用下面的开源库:
- JCPP,C预处理器的纯Java实现,用于预处理翻译单元
- ANTLR用于解析以及ANTLR C grammar
- Grappa为图形数据结构和图形绘制(如果需要)
+1
你的例子并不包括你可以用C写的讨厌的东西。把一个标签放在一个块的中间是完全合法的,并且**从块外面转到它是完全合法的。将案例结构不合理的构建切换语句放入是完全合法的。在海湾合作委员会,你有间接的。 C的大多数版本都允许setjmp。所有这些都可以使看起来像结构化程序的东西变成意大利面条。 – 2010-06-22 14:19:42
+0
@Ira:是的。我已经忘记了C的这些特征。但是,希望遵循这个策略将产生一个能够处理这些额外情况的程序。 – 2010-06-23 23:31:48
相关问题
- 1. 将C#代码转换为程序集
- 2. 将Java控制台程序转换为Web应用程序
- 3. 有没有将Java代码转换为C++的程序?
- 4. 将Java代码转换为C#代码
- 5. 将广告JavaScript代码转换为流星应用程序
- 6. 将控制台应用程序转换为Windows应用程序
- 7. 将Java代码转化为程序?
- 8. 将伪代码转换为程序集
- 9. 如何为C代码生成控制流程图
- 10. 将GUI C++应用程序转换为控制台之一
- 11. 将C#控制台应用程序转换为VB.NET和VBA
- 12. 试图将Dart程序转换为Java
- 13. 如何将GUI C++应用程序转换为控制台应用程序?
- 14. 将XAML转换为用于动态控制的代码
- 15. 使用C和asm代码将程序转换为DLL
- 16. 将控制台代码转换为JOptionPane
- 17. 将C++程序转换为程序集
- 18. 将C程序转换为程序集?
- 19. 简单的方法将c代码转换为x86程序集?
- 20. 将Java代码文档转换为C#
- 21. 将代码从Java转换为C#/ ASP.NET
- 22. 将C代码转换为Java:指针
- 23. 将OpenCV代码从C++转换为Java
- 24. 将C代码转换为Java
- 25. Java - 将控制台游戏转换为小程序
- 26. 将Flash代码转换为html5代码的库/ API /程序
- 27. 将Java应用程序转换为Applet
- 28. 将C程序转换为汇编代码
- 29. 将C代码转换为x86-64程序集
- 30. 用于C++代码的控制流图生成器
你有使用Java,或者仅仅是在JVM上运行的东西吗? – 2010-06-20 15:58:56
我必须使用Java – 2010-06-20 16:13:40
你有什么帮助?创建一个解析器,然后创建语义分析器,然后构建一个流程图。 – Drakosha 2010-06-20 20:00:06