i am trying to make a code that searchs for a "for" loop in the input file, replace it with its "while" equivalent, leaving the rest untouched, and create a new output file with the new code, i need ideas and some help, i dont exactly expect someone else to do it. (remember, there may be another for loop inside a for loop) ex.
for(i=0;i<10;i++) {
some stuff here;
}
to
i=0;
while(i<10) {
the exact same stuff here;
i++;
}
or
for(X;Y;Z) {
K;
}
to
A;
while(Y) {
K;
Z;
}
答案 0 :(得分:1)
您需要考虑“继续”语句。 如果您遇到以下代码怎么办?
for (i=0;i<10;i++)
{
if (i%2) continue;
print_i();
}
您的解决方案可以实现:
i=0;
while (i<10)
{
if (i%2) continue;
print_i();
i++;
}
运行死循环。
答案 1 :(得分:1)
您是否熟悉使用grep
或sed
等Unix实用程序?如果是这样,你可以使用这些工具用shell脚本,python脚本或者带有系统调用的另一个C程序为你重写你的C程序。
要隔离for循环,请逐行逐字地读取程序,直到找到单词“for”,此时应检查下一个字符是空格还是左括号。然后,开始搜索大括号;如果你到达一个开括号,增加一个名为braces
的变量。如果你到达另一个开放式大括号,再次增加braces
,同样,如果你到达一个右大括号,则递减braces
。当braces
等于0时,您已到达此循环的末尾。
现在有了sed
甚至是cut
的有趣部分(如果您不熟悉使用正则表达式,这可能会有所帮助:https://unix.stackexchange.com/questions/159367/using-sed-to-find-and-replace)
C中的“for”循环用分号分隔其条件;因此,使用cut
提取在保留字for
之后找到的第一个和第二个分号之间的字段。这将成为while
循环的条件。
重复此过程以提取第一个字段(通常是您的索引变量)和第三个字段(如何处理索引变量;通常,这将是while
循环中的最后一行)。< / p>
循环的主体应保持不变。请注意,虽然这是一个通用过程,但很难考虑每种可能的情况 - 您的for
循环可能正在使用迭代器,或基于范围的循环,或广泛的其他用途。但是如果您熟悉它们,那么一般过程可以很好地使用Unix实用程序。
答案 2 :(得分:0)
为了准确地解析和编辑c文件,你可以编写一个与clang集成的工具,这样就可以像其他文件一样整理了#c;工具。取决于您想要投入多少精力来实现自动化。