0

我有一个庞大的代码库要整理,所以我想尽可能地自动化这个过程。我已经设法找出与我的任务相关的所有行,但我想自动化任务本身。

我要做的是将所有尾随增量更改为前导增量,如下例所示:

i++;

变成

++i;

我想会涉及到正则表达式,而我对这些很生疏。另外,哪种语言最适合编写脚本?我目前正在使用 Windows 7 x64,但与平台无关的解决方案会很酷。此外,如果您可以向我指出任何特定资源以了解有关此类问题的更多信息,那将是很棒的。

4

3 回答 3

2

这样就可以了...

s/([a-z0-9]+)\+\+/++$1/g

但它是邪恶的,并且会破坏以下内容:

print "+++++++++Some heading++++++++++++\n";

更不用说 i++ 和 ++i 实际上做不同事情的情况了,你需要使用 i++。

我的建议(假设您实际上有一些真正的理由认为 i++ 在许多情况下是错误的):

rgrep ++ * > fixme.txt

然后fixme.txt在您最喜欢的文本编辑器中打开,并手动调查每次出现的情况,并随时将其从文本文件中删除。

于 2012-07-11T17:08:16.743 回答
0

首先,请参阅[13.15] 哪个更有效:i++ 还是 ++i? 对于像 之类的原始类型int,效率没有任何提高。但是,假设您知道这一点,解决方案取决于您将使用的工具。如果您使用的是 Perl,即

perl -pi -w -e 's/search/replace/g;' *.cc

...那么这个正则表达式将起作用:

s/\b([a-zA-Z]\w*)\+\+/\+\+$1/g

我同意@Flimzy,尽管这看起来非常危险,不应该自动化。

于 2012-07-11T17:18:28.987 回答
0

我以前用项目做过这个。如果您的代码库位于存储库中,这是一个好主意。方便的是,这允许您运行更改,然后将项目差异转储到您喜欢的文本编辑器中,以查看所有更改。快速浏览可以让您查看是否有任何意外的内容被编辑,并且您可以将其修复。

除了使用建议的正则表达式 Flimzy 之外,另一个选择是构建一个小型词法分析器/解析器来适应这个用例。你不是在寻找一个成熟的编译器,只是有足够的状态来评论和引用的东西。

Lex&Yacc 第二。埃德。有一个用于读取 c 代码的示例词法分析器,它非常小,展示了这个工具链的强大功能。我相信这些例子在其他地方也可以找到。如果它看起来很复杂,您可以使用简单的状态机和使用 perl 脚本构建的正则表达式系统来伪造它。

最后,如果您更愿意使用 python ,还可以查看ply 。

于 2012-07-11T17:18:58.837 回答