有没有任何工具可以将C ++ for-loops重写为stl算法?

时间:2012-01-25 17:00:46

标签: c++ stl static-analysis

在C# Resharper 中设法将old-school for循环重写为 LINQ 表达式。是否有任何工具可以在C ++中完成相同的工作,区别在于它重写for-loops以利用stl算法?

2 个答案:

答案 0 :(得分:2)

为此,您需要一个Program Transformation系统,例如DMS Software Reengineering Toolkit及其C++ Front End

DMS将代码解析为AST,启用各种分析,可以应用以分析为条件的源到源转换,并可以从转换后的AST中重新生成源代码。

在其中一条评论中,Rob sez:

  

我会找一个替换为(T :: iterator it = c.begin();它< c.end(); ++ it)x(* it)for for(auto& t)的工具:c)x(t)。

使用DMS编写非常简单:

 rule robs_rule(T:IDENTIFIER, it:IDENTIFIER, 
                c:IDENTIFIER, x: IDENTIFIER)
     :statement->statement
 = " for(\T::iterator \it = \c.begin(); \it < \c.end(); ++\it) \x(*\it)"
   =>  "for(auto& \t : \c) \x(\t)";

虽然规则似乎是文本,但它实际上描述了AST到AST的重写;它用DMS C ++前端解析。因此匹配是可靠的,而不是基于字符串黑客攻击。 (\ c在模式中出现两次的事实强制两者相同)。

在实践中,您需要很多规则来涵盖您关注的案例,并且您可能希望更多地概括它们,例如应用* \ it =&gt;它在一份附属声明中。利用各种流分析来支持转换也很有用。此时,DMS提供了控制流分析,但尚未提供C ++的数据流分析。

目前,这些任务是可能的,但不一定容易用DMS编写。它已经被用来进行大规模的C ++架构重塑;查看网站上的参考书目。

答案 1 :(得分:1)

嗯,可能是那里还没有这样的工具(还)。在此期间,您可以查看cppcheck。这是一个静态代码分析工具。它在通用方面做得相当不错,但它也允许您定义自己的规则集。这可能会让您真正接近C#Resharper解决方案。