区分注释代码与有效注释

Distinguish commented code vs valid comments

本文关键字:注释 有效 代码      更新时间:2023-10-16

我必须使用一个到处都有大量注释代码的项目。在引入任何更改之前,我想进行基本的清理并删除旧的未使用代码。

所以我可以使用这个公认的答案中的解决方案来删除所有评论,但是......

有合法的评论(不是注释的代码)可以解释事情。我不想删除它。例如:

// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;  <- commented code
int k = 2*t;

仅应删除第 3 行。

分析代码和区分自然语言注释和注释代码行的可能方法是什么?

这是一种基本方法,但它提出了可以做什么的概念证明。我使用 Bash 以及 GCC-fsyntax-only选项来做到这一点。

这是 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//分隔符(如果存在)之后的文本,并将其传递给gcc -fsyntax-only命令以检查它是否是正确的 C/C++ 语句。请注意,我已经使用参数-xc -将输入从 stdin 传递给 GCC(请参阅我的答案 此处 了解更多信息)。一个重要的注意事项,-xc -中的c指定了语言,在这种情况下是 C,如果您希望它C++则应将其更改为-xc++

然后,如果 GCC 能够成功解析该语句(即,它是一个合法的 C/C++ 语句),我直接从传递的文件中使用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;

(如果要将修改添加到其他文件中,只需从sed -i中删除-i即可)

该脚本可以像这样调用:./script.sh file.cpp,它可能会显示几个 GCC 错误,因为这些是有效的注释。


更新。

相同逻辑的简化版本是:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
if [[ "$line" =~  [/]+.* ]]; then
$LINE=${line##*/}
echo ${$LINE} | gcc -fsyntax-only -xc - && sed -i "/$LINE/d" ./$1
fi
done < "$1"

你可以通过一些简单的正则表达式来获得大部分方法。基本上,在以下情况下,一行很可能不是代码:

  • 它以一些或没有空格开头,
  • 其次是//
  • 后跟一些仅包含空格、字母、数字和基本标点符号的文本,
  • 并且不以;结尾.

您可以为上述组合(或其反向组合)编写正则表达式,并大致了解有多少实际要删除的候选者。在 100k 行中,可能只有不到 1k 行与这个简单的过滤器匹配,这绝对在"可以手动通过它"的范围内。

我很可能会从搜索与w*//.*;匹配的行开始,查看结果并确认可以删除所有这些行。此处的误报数应该非常低。请注意,这不会捕获被注释掉的多行语句。