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等).
这是特定编译器扩展的一个很好的例子.在最近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知道嵌套!) .