区分注释的代码与有效的注释

时间:2019-01-10 15:35:20

标签: c++ refactoring heuristics static-code-analysis

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

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

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

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

仅应删除第3行。

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

2 个答案:

答案 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*//.*;的行开始,仔细检查结果并确认所有这些行都可以删除。此处的误报数应该非常低。请注意,这不会捕获已注释掉的多行语句。