我有一个非常古老的大型x86项目,现在我需要将它移植到x64架构。 不幸的是,混合int / memsize类型有很多错误。例如:
std::vector<T> vec;
for(int i = 0; i < vec.size(); ++i) // error, i must be size_t
{
}
所以我想要的是将int更改为size_t来替换所有这些字符串。 形式上,问题可以说如下:
查找符合以下条件的字符串:
for(int [var name] = 0; [var name] < [container name].size(); [any expression])
将其替换为:
for(size_t [var name] = 0; [var name] < [container name].size(); [any expression])
我正在使用visual studio 2008.我正在寻找解决此问题的最正确方法。 谢谢。
答案 0 :(得分:1)
正则表达式可以找到:for[:b\n]*\([:b\n]*int[:b\n]+{:i}[:b\n]*=[:b\n]*0[:b\n]*;[:b\n]*{:i}[:b\n]*\<[:b\n]*{:i}\.size[:b\n]*\([:b\n]*\);[:b\n]*
替换为:for(size_t \1 = 0; \2 < \3.size();
(注意结束空格)
答案 1 :(得分:0)
“最正确的解决方案”可能涉及使用理解C ++语法的解析器,然后在操作解析树后使用该解析器重写代码。 C ++语法并不简单,对于像这样的任务,除非项目特别大,否则你很可能不得不恢复使用在大多数情况下工作的东西,而不是在技术上正确。
最简单的方法可能是编写一组搜索/替换正则表达式来完成这项工作,正则表达式近似于可能的用例,但从下面的例子中可以看出,正则表达式很可能是难以阅读。
这是一个用Python编写的实用程序,它近似于你要做的事情。它将在stdin或命令行上获取一个文件,并在stdout上生成转换后的文本。正则表达式严格匹配相同的标识符。
#!/usr/bin/env python
import fileinput
import sys
import re
regex = re.compile(
r"""(?P<start>^\s*for\s*\( # Leading for construct
)(?P<type>int)(?P<remainder>\s+(?P<identifier>[A-Za-z_][0-9A-Za-z]*) # int type followed by identifier
\s*=\s*0\s*; # Matches '= 0;'
\s*(?P=identifier)\s*<\s*(?P<container>[A-Za-z_][0-9A-Za-z]*)\.size\(\); # ident < container.size();
[^)]*\).*$)""",
re.VERBOSE)
for line in fileinput.input():
line = line.rstrip()
match_object = regex.match(line)
if match_object is not None:
line = match_object.expand('\g<start>size_t\g<remainder>')
print line