区分注释代码与有效注释

Distinguish commented code vs valid comments

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

所以我可以使用 this accepted answer 中的解决方案来删除所有评论,但是...

有解释内容的合法注释(不是注释代码)。我不想删除它。例如:

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

只应删除第 3 行。

分析代码并区分自然语言注释和注释代码行的可能方法有哪些?

您可以使用一些简单的正则表达式来完成大部分工作。基本上,一行很可能是 not code if:

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

您可以为上述组合(或其逆组合)编写一个正则表达式,并大致了解有多少实际要删除的候选对象。在 100,000 行中,可能只有不到 1,000 行符合这个简单的过滤器,而且肯定在 "can go through it manually" 范围内。

我最有可能从搜索匹配 \w*//.*; 的行开始,查看结果并确认可以删除所有这些行。这里的假阳性数应该是极低的。请注意,这不会捕获被注释掉的多行语句。

这是一种基本方法,但它提出了可以做什么的概念证明。我使用 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" ./
            fi
    fi
done < ""

我在这里采用的方法是从代码文件中读取每一行。然后,grep使用正则表达式 (?<=//).*// 分隔符 (如果存在) 之后的文本传递给 gcc -fsyntax-only命令 检查它是否是正确的 C/C++ 语句 。请注意,我使用参数 -xc - 将输入从标准输入 传递给 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" ./
    fi
done < ""