Php 从各种语言的源代码中删除/去除所有注释的通用工具?
我正在寻找一个命令行工具,从输入中删除所有注释 文件并返回剥离的输出。如果它支持流行音乐那就太好了 编程语言如C、C++、Python、PHP、JavaScript、HTML、CSS等。 必须具有语法意识,而不是基于regexp,因为后者将捕获 源代码字符串中的模式也是如此。有这样的工具吗 我充分意识到,评论是有用的信息,经常会留下它们Php 从各种语言的源代码中删除/去除所有注释的通用工具?,php,python,c,Php,Python,C,我正在寻找一个命令行工具,从输入中删除所有注释 文件并返回剥离的输出。如果它支持流行音乐那就太好了 编程语言如C、C++、Python、PHP、JavaScript、HTML、CSS等。 必须具有语法意识,而不是基于regexp,因为后者将捕获 源代码字符串中的模式也是如此。有这样的工具吗 我充分意识到,评论是有用的信息,经常会留下它们 因为他们是一个好主意。只是我的重点放在不同的用例上。我不知道有这样一个工具,这和说没有一样 我曾经设计过一个,但它很快变得疯狂——没有被C和C++中的注释规则所
因为他们是一个好主意。只是我的重点放在不同的用例上。我不知道有这样一个工具,这和说没有一样 <>我曾经设计过一个,但它很快变得疯狂——没有被C和C++中的注释规则所帮助。
/\
* Comment? *\
/
(回答:是的!)
(回答:没有!)
为了合理地开展工作,您必须了解:
- 语言注释约定
- 语言引用的字符串约定(Python和Perl足以让您发疯)
- 转义约定(Shell将您带到这里-以及引号)
--strip comments
选项删除文件中的注释和空行,然后将精简后的文件与原始文件进行比较
它支持。您可以通过哄骗做到这一点。您想要的可以通过emacs脚本完成 我为您编写了这个脚本,它完全符合您的要求,可以轻松地扩展到任何语言 Filename:kill comments
#!/usr/bin/python
import subprocess
import sys
import os
target_file = sys.argv[1]
command = "emacs -batch -l ~/.emacs-batch " + \
target_file + \
" --eval '(kill-comment (count-lines (point-min) (point-max)))'" + \
" -f save-buffer"
#to load a custom .emacs script (for more syntax support),
#use -l <file> in the above command
#print command
fnull = open(os.devnull, 'w')
subprocess.call(command, shell = True, stdout = fnull, stderr = fnull)
fnull.close()
通过添加javascript,这将从您提到的所有文件类型以及更多文件类型中删除注释
祝你好运和快乐 Paul Dixon关于从脚本中剥离注释的文章可能值得一看。目前还没有这样的工具。很抱歉,该工具在测试python文件中遗漏了很多注释,甚至是最基本的注释实例。它不是基于regexp吗?我不知道你是否试过,但它似乎无法用于此目的。@otz:这是一个成熟的工具,在我的任何使用上都没有失败,包括Python脚本。我认为你用得不对。例如,在带有文件
foo.py
的目录中执行的命令perl/path/to/cloc-1.51.pl--strip comments=n.
将创建一个带有注释和空行的foo.py.n
文件。我想看一个你声称不起作用的例子(我相信cloc的开发人员也会这样做)。javascript内联注释失败:lol。虽然它不够健壮,因为大多数语言上的emacs高亮显示都是基于regexp的(因此会捕捉到某些奇怪的字符串形式的注释,但你的想法给我留下了深刻的印象:)不过,我想要的是一个语法感知工具。因此,它必须内置语言解析器(JavaCC.jj.jjt文件有人吗?),您应该在关闭它之前在一些测试文件上试用它。Emacs语法突出显示非常好。在Emacs上尝试了(kill comment ARG)。总的来说,我对它的准确性感到满意。它的准确度肯定比本页上建议的cloc工具高出一百万倍。所以谢谢你。但是,kill comment函数同样依赖于emacs中的语法突出显示,其中大多数是基于regexp的。所以这实际上取决于-mode.el有多好。但是,我还是喜欢你的想法。“理想地”,你需要一个嵌入的编译器/解释器用于语言,但是考虑到事实上确定什么是注释,什么是不可能的,对于某些病理语言来说是不可计算的(因此永远),在这种情况下,你实际上想去基于正则表达式的方法来移除。“标准”注释!对于许多语言来说,删除注释不需要拉式解析,并且可以证明正则表达式方法是正确的(这是预处理器可能会做的)。记住投票选出您认为有用的答案/选择一个作为“答案”“按照这里的礼节回答。如果我错了,请纠正我,但在我看来,它不完全了解语法。它是半语法感知的,因为它本质上是基于regexp的,但是regexp是“结构化的”,这取决于语言。是的。我知道。我可以用javacc和可用的syntax.jj文件自己编写这样一个工具(对于所有流行语言,都有很多可用的文件)。我只是想知道有没有人试过。(顺便说一句,我所有的问题都没有得到完全满意的回答…)OP提到了多种语言,但Paul Dixons提到的方法只适用于PHP。
#!/usr/bin/python
import subprocess
import sys
import os
target_file = sys.argv[1]
command = "emacs -batch -l ~/.emacs-batch " + \
target_file + \
" --eval '(kill-comment (count-lines (point-min) (point-max)))'" + \
" -f save-buffer"
#to load a custom .emacs script (for more syntax support),
#use -l <file> in the above command
#print command
fnull = open(os.devnull, 'w')
subprocess.call(command, shell = True, stdout = fnull, stderr = fnull)
fnull.close()
kill-comments <file-name>
(setq load-path (append (list (concat (getenv "HOME") "/.el")) load-path))
(load "javascript")
(setq auto-mode-alist (cons '("\\.js$" . javascript-mode) auto-mode-alist))