【问题标题】:Is there a reliable tool for removing comments in ASM/C/C++ code?是否有可靠的工具来删除 ASM/C/C++ 代码中的注释?
【发布时间】:2013-08-12 22:09:33
【问题描述】:

我知道以前有人问过这个问题(例如:见Remove comments from C/C++ code),但我没有找到任何令人满意的结果。

我正在解析一组复杂的 C/C++ 代码,首先必须对其进行规范化,其中包括从输入源代码中消除 cmets。

我尝试过的所有反注释工具都在一定程度上失败了,其中包括:

  • 评论
  • stripcmt
  • cloc

注意:我也试过“gcc -fpreprocessed -E”,但结果并不完美;输出有一些奇怪的宏注释,用于跟踪某些代码行。

为了说明特定工具 (cloc) 的问题,从 this header file 中删除 cmets 也会导致删除非 cmets,例如该文件开头的所有包含。

也就是说,是否有任何可靠的注释删除工具可用于在异常复杂的代码中去除 cmets?

非常感谢。

【问题讨论】:

  • 正如 Dana Robinson 在对 this answer 的评论中指出的那样,您也可以添加 -P 标志来禁止行号跟踪注释。
  • True... 使用 -P 似乎可以解决问题:)
  • 如果你在解析 C/C++,为什么 lexing/tossing out cmets 很困难?这在词汇层面应该是小菜一碟。你真的在解析 C++ 吗? [查看我的简历,了解可以消除 cmets 的漂亮打印机]
  • Ira,我会小心你的说法,因为我之前提到的所有三个工具都很标准,但都失败了。虽然不是地球上最难的问题,但创建自动机需要时间(除非使用 jflex)。为了回答你的问题,解析是在去注释之后完成的。
  • 你为什么要问?也许定制 GCC,例如MELT 可能会有用!

标签: c++ c linux refactoring


【解决方案1】:
#!/bin/bash

if [[ "$#" != 1 ]] ; then
  echo "Usage: stripcomments input-file" > /dev/stderr
  exit
fi

gcc -fpreprocessed -dD -E -P "$1" 2> /dev/null

【讨论】:

    【解决方案2】:

    您可以删除 // 之后直到 EOL 之后的所有内容,如果需要,可以使用几个正则表达式删除 /**/...

    对于单行 cmets,您可以使用:\/\/(.*)

    对于多行 cmets,此:\/\*(.*)\*\/

    【讨论】:

    • 如果程序有一个字符串 "//abc" 你的方案会损坏这个字符串。
    • 你这是什么意思?单行 cmets 一直持续到行尾,那么它到底破坏了什么?
    • 一个愚蠢的正则表达式(你的,对不起)将看到字符 // 在 C 文字字符串中,并认为它们只是文字字符串的一部分时开始注释。这就是为什么您需要谨慎地为该语言构建词法分析器,而不仅仅是使用过于简单的正则表达式来破解您的方式。
    • 不用抱歉,我在几秒钟内就写好了,最后我尝试使用 \w 但它搞砸了,我已经厌倦了完全诚实地写出答案。我没有想到那种情况,我就像“C cmets 总是在 EOL 结束,所以它会起作用”而不考虑 cmets,很好。
    • 不考虑字符串中的 cmets*
    猜你喜欢
    • 2010-09-17
    • 2011-05-23
    • 2023-03-16
    • 1970-01-01
    • 2016-07-27
    • 2012-06-05
    • 2015-05-06
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多