我必须处理一个到处都有大量注释代码的项目。在介绍任何更改之前,我想进行基本清理并删除旧的未使用的代码。
所以我可以使用this accepted answer中的解决方案删除所有评论,但是...
有合法的注释(不是注释的代码)可以解释内容。我不想删除它。例如:
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10; <- commented code
int k = 2*t;
仅应删除第3行。
分析代码并区分自然语言注释和代码注释行的可能方法是什么?
答案 0 :(得分:3)
这是一种基本方法,但是它提出了可以做什么的概念证明。我使用Bash以及GCC -fsyntax-only
option的用法。
这是bash脚本:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
LINE=`echo $line | grep -oP "(?<=//).*"`
if [[ -n "$LINE" ]]; then
echo $LINE | gcc -fsyntax-only -xc -
if [[ $? -eq 0 ]]; then
sed -i "/$LINE/d" ./$1
fi
fi
done < "$1"
我在这里遵循的方法是从代码文件中读取每一行。然后,使用正则表达式grep
//
分隔符(如果存在)之后的文本,并将其传递给(?<=//).*
命令检查它是否是正确的C / C ++语句。请注意,我已经使用参数gcc -fsyntax-only
将输入从stdin (see my answer here传递给GCC,以了解更多信息)。 重要注释,-xc -
中的c
指定了语言,在这种情况下为C,如果您希望它成为C ++,则应将其更改为{{1} }。
然后,如果GCC能够成功解析该语句(即,这是合法的C / C ++语句),则可以使用-xc -
从传递的文件中直接将其删除。
在您的示例上运行它(,但从第三行中删除-xc++
使其成为合法语句之后):
sed -i
输出(在同一文件中):
<- commented code
(如果要在其他文件中添加修改,只需从// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;
int k = 2*t;
中删除// Those parameters control foo and bar... <- valid comment
int t = 5;
int k = 2*t;
)
该脚本可以像-i
那样调用,它可能会显示几个GCC错误,因为这些是有效的注释。
同一逻辑的更简化的版本是:
sed -i
答案 1 :(得分:0)
您可以使用一些简单的正则表达式来完成大部分工作。基本上,如果满足以下条件,则行很可能不是代码:
//
,;
结尾。您可以为上述组合(或其反面)编写一个正则表达式,并获得有关要删除的实际候选对象的概述。在100k行中,与该简单过滤器匹配的行可能少于1k行,并且绝对在“可以手动通过它”范围内。
我最有可能从grep匹配\w*//.*;
的行开始,仔细检查结果并确认所有这些行都可以删除。此处的误报数应该非常低。请注意,这不会捕获已注释掉的多行语句。