自动将pass-by-value更改为pass-by-reference

时间:2011-04-25 13:24:53

标签: regex refactoring reference pass-by-reference pass-by-value

我有从手动java到c ++端口的数百个函数。在结果c ++代码中,我希望将值传递的参数更改为通过引用传递:

from:
void funcName1( Type1 t1, Type2 t2, int i);
to:
void funcName2( Type1& t1, Type2& t2, int i);

最好保留原始类型,如int,float不变。

任何重构工具都可以自动完成此过程?一些正则表达技巧?

或者将可移植java代码转换为c ++的任何工具?

1 个答案:

答案 0 :(得分:1)

尝试创建2个正则表达式:

void\s+\w+\(([^\)]+))
([A-Z]\w+)\s+\w+

匹配第一组的第1组将为您提供:

 Type1 t1, Type2 t2, int i

针对此输出运行第二个,组1将为:

 Type

如果您使用的是java,则可以使用以下命令快速转换:

Pattern p = Pattern.compile("(void\\s+\\w+\\s+\)(([^\\)]+))");
Pattern p2 = Pattern.compile("([A-Z]\\w+)(\\s+\\w+)");
Matcher m = p.matcher("input.....");

StringBuffer sb = new StringBuffer();
while(m.find()) {
   Matcher m2 = p2.matcher(m.group(0));

   StringBuffer sb2 = new StringBuffer();
   while(m2.find()) {
      m2.appendReplacement(sb2, "$1&$2")
   }
   m2.appendTail(sb2);

   m.appendReplacement(sb, "$1("+sb2.toString()+")")
}
m.appendTail(sb);