c++ - 区分注释代码与有效注释
问题描述
我必须处理一个到处都有大量注释代码的项目。在我介绍任何更改之前,我想做一个基本的清理并删除旧的未使用代码。
所以我可以使用这个接受的答案中的解决方案来删除所有评论,但是......
有解释内容的合法注释(不是注释代码)。我不想删除它。例如:
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10; <- commented code
int k = 2*t;
只应删除第 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 (请参阅我的答案以了解更多信息)。重要说明,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;
(如果你想在不同的文件中添加你的修改,只需删除-i
from 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"
推荐阅读
- python - 可以将图像中的物体提取到黑色背景中的图像处理算法
- css - 我的 svg 文本中某些角落的奇怪间隙是什么?
- c# - VB6--COM Interop--C#(VS2019) SQL查询超时当调用两个表时。加入
- android - 使用 BitmapFactory 时在 Android 中将 Int 图像数组解析为字节数组失败
- c++ - Rxcpp:如何复制 OfType 运算符?
- python - 如何将我的 .wav 文件重新定义为 HTML 文件?
- node.js - nodeJS的经过身份验证的代理检查器
- javascript - 将值从我的 Json (Node.js + Express) 传递到我的最终应用程序
- r - 如何在图表ggplot2中放置点?
- c++11 - 重载 << 运算符的问题