首页 > 解决方案 > 区分注释代码与有效注释

问题描述

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

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

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

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

只应删除第 3 行。

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

标签: c++refactoringheuristicsstatic-code-analysis

解决方案


这是一种基本方法,但它提出了可以做什么的概念证明。我使用 Bash 和GCC -fsyntax-onlyoption来完成它。

这是 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 请参阅我的答案以了解更多信息)。重要说明,in指定语言,在这种情况下为 C,如果您希望它是 C++,您应将其更改.//(?<=//).*gcc -fsyntax-only-xc -c-xc --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;

(如果你想在不同的文件中添加你的修改,只需删除-ifrom sed -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"

推荐阅读