首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >区分注释代码和有效注释

区分注释代码和有效注释
EN

Stack Overflow用户
提问于 2019-01-10 15:35:20
回答 2查看 396关注 0票数 3

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

所以我可以用this accepted answer的解决方案删除所有的注释,但是.

有合法的注释(不是注释代码)来解释事情。我不想把它移走。例如:

代码语言:javascript
运行
复制
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;  <- commented code
int k = 2*t;

只应删除第3行。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-10 16:40:05

这是一个基本的方法,但它提出了一个概念的证明什么可以做。我使用的是Bash和 option的用法。

下面是bash脚本:

代码语言:javascript
运行
复制
#!/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使其成为合法语句之后):

代码语言:javascript
运行
复制
// Those parameters control foo and bar... <- valid comment
int t = 5;
// int t = 10;
int k = 2*t;

输出(在同一个文件中):

代码语言:javascript
运行
复制
// Those parameters control foo and bar... <- valid comment
int t = 5;
int k = 2*t;

(如果要将修改添加到不同的文件中,只需将-ised -i__中删除即可)

这个脚本可以被称为:./script.sh file.cpp,它可能会显示几个GCC错误,因为这些都是有效的注释。

更新。

同一逻辑的一个更简化的版本是:

代码语言:javascript
运行
复制
#!/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"
票数 2
EN

Stack Overflow用户

发布于 2019-01-10 16:05:49

你可以用一些简单的正则表达式实现大部分的方式。基本上,如果以下情况下,一行最有可能是而不是代码:

  • 它开始于一些或没有空格,
  • 其次是//
  • 后面跟着一些只包含空格、字母、数字和基本标点符号的文本,
  • 并且不会以;结尾。

您可以为上述组合(或其逆组合)编写正则表达式,并对实际需要删除的候选人数量进行概述。在100 k行中,可能有不到1k行与这个简单的过滤器匹配,这肯定在“可以手动通过”范围内。

我最有可能从寻找匹配\w*//.*;的行开始,查看结果并确认所有的结果都可以删除。这里的假阳性数应该是极低的。请注意,这不会捕获被注释掉的多行语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54132043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档