我必须处理一个到处都有大量注释代码的项目。在我介绍任何更改之前,我想做一个基本的清理和删除旧的未使用的代码。
所以我可以用this accepted answer的解决方案删除所有的注释,但是.
有合法的注释(不是注释代码)来解释事情。我不想把它移走。例如:
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10; <- commented code
int k = 2*t;
只应删除第3行。
分析代码并区分自然语言注释和注释代码行的可能方法是什么?
发布于 2019-01-10 16:40:05
这是一个基本的方法,但它提出了一个概念的证明什么可以做。我使用的是Bash和 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"
这里我遵循的方法是从代码文件中读取每一行。然后,使用regex grep
在//
分隔符(如果存在的话)之后对文本进行//
,并将其传递给gcc -fsyntax-only
命令,以检查它是否是正确的C/C++语句。注意,我使用了参数-xc -
将输入从stdin传递给GCC (https://stackoverflow.com/a/47999843/7347631可以理解更多)。这是一个重要的注释,-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;
(如果要将修改添加到不同的文件中,只需将-i
从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"
发布于 2019-01-10 16:05:49
你可以用一些简单的正则表达式实现大部分的方式。基本上,如果以下情况下,一行最有可能是而不是代码:
//
,;
结尾。您可以为上述组合(或其逆组合)编写正则表达式,并对实际需要删除的候选人数量进行概述。在100 k行中,可能有不到1k行与这个简单的过滤器匹配,这肯定在“可以手动通过”范围内。
我最有可能从寻找匹配\w*//.*;
的行开始,查看结果并确认所有的结果都可以删除。这里的假阳性数应该是极低的。请注意,这不会捕获被注释掉的多行语句。
https://stackoverflow.com/questions/54132043
复制相似问题