区分注释代码和有效注释

3
我需要处理一个项目,里面到处都是注释的代码。在引入任何更改之前,我想进行基本的清理并删除旧的未使用的代码。
因此,我可以使用来自这个被接受的答案的解决方案来删除所有注释,但是...
有一些合法的注释(不是注释的代码)用于解释内容。我不想删除它。例如:
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;  <- commented code
int k = 2*t;

只有第3行应该被删除。

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


1
也许你可以通过你的版本控制系统来搞一些东西,删除任何以 // 开头的行。 - François Andrieux
1
抱歉,工具推荐问题不适合在stackoverflow上提问。 - Max Langhof
3
检查一行代码是否符合 C++ 规范可能并不容易。你需要假设某些注释中包含复杂的代码行,这些代码依赖于已经不存在的标识符或者包含错误且无法被识别为有效的 C++ 代码。 - François Andrieux
3
哎呀,我讨厌人们总是留下无用代码。这就是版本控制存在的意义!很高兴你想要清理它们。不过,嗯,祝你好运 ::( - Lightness Races in Orbit
2
我偶尔会在注释中使用伪代码,有时候这个伪代码看起来非常像真正的代码。例如,在Python或R中只需要一行代码,但在C或C++中可能需要多行(有时候甚至需要几十行)才能实现相同的功能。即使这些一行代码的注释看起来像真正的代码,它们也需要保留。 - David Hammen
显示剩余11条评论
2个回答

2
这是一种基本的方法,但它提供了一个概念证明,说明可能会做些什么。我使用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"

0

你可以通过一些简单的正则表达式来实现大部分功能。基本上,如果一行满足以下条件,则最有可能不是代码:

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

你可以为上述组合(或其反向)编写一个正则表达式,并概览有多少实际的候选项需要删除。在 100k 行中,可能只有不到 1k 行符合这个简单的过滤器,而这绝对在“可以手动处理”的范围内。

我最有可能从匹配\w*//.*;的行开始 grepping,查看结果并确认它们都可以被删除。误报率应该极低。请注意,这不会捕获被注释掉的多行语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接