区分注释代码与有效注释
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 < ""
我必须处理一个到处都有大量注释代码的项目。在我介绍任何更改之前,我想做一个基本的清理并删除旧的未使用的代码。
所以我可以使用 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 < ""