C - 如何使用grep查找所有内部循环?

psi*_*lia 10 c regex grep code-analysis

我有一个包含大量C文件的巨型C项目.我必须找到所有内循环.我确信项目中没有任何O(n³)块,因此只能找到O(n²)-compexity块(循环中的循环).

是否可以使用grep找到所有内部循环?如果是,我可以使用什么正则表达式来查找所有类型的内部循环,例如{for,for},{while,for},{for,while},{do,while}等等?如果没有,是否有任何简单的unix-way方法(可能是多个greps或一种awk)?

6D6*_*D65 12

正则表达式是常规语言,你所描述的似乎是无上下文,我很确定使用正则表达式无法完成.在这里查看类似问题的答案 .你应该寻找其他类型的自动机,如脚本语言(python等).

  • @psihodelia你不能使用正则表达式来跟踪匹配大括号之类的东西,所以当你可以在另一个`for`之间找到`for`时,你不能说它是否在第一个`for`里面. (3认同)
  • @psihodelia你可以尝试用'grep'来代替([^,]*,[^,]*,[^]]*){[^}]*为'`,但是在很多情况下都会失败你不能做得更好,因为正则表达式不能匹配parens或braces,所以如果你在nest中有一个`if {...}`,你就无法区分`}`和end brace括号你的`for(...){...}`. (2认同)

Bas*_*tch 5

这是特定编译器扩展的一个很好的例子.在最近GCC编译器(即版本4.6的GCC)可以延伸通过插件(在C痛苦编码)或通过MELT扩展; MELT是一种用于编写GCC扩展的高级域特定语言,而且MELT比C语言易于使用.

但是,我承认编写GCC扩展并不是完全无关紧要的:你必须部分理解 GCC 如何工作的,以及它的主要内部表示是什么(Gimple,Tree,...).在扩展GCC时,您基本上可以添加自己的编译器传递,它可以执行您想要的任何操作(包括检测嵌套循环).编写GCC扩展通常超过一周的工作.(最难的部分是了解GCC的工作原理).

在GCC框架中工作的大优势(通过C中的插件或MELT中的扩展)是您的扩展正在处理与编译器相同的数据.

回到找到嵌套循环的问题,不要认为它只是纯粹的语法(这就是为什么grep不能工作).在GCC编译器,在内部表示一定程度,通过实现一个循环for,或者while,或者do,甚至与goto-s,仍然被认为是一个循环,并为GCC这些东西都可以被嵌套(和GCC知道嵌套!) .