Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从各种语言的源代码中删除/去除所有注释的通用工具?_Php_Python_C - Fatal编程技术网

Php 从各种语言的源代码中删除/去除所有注释的通用工具?

Php 从各种语言的源代码中删除/去除所有注释的通用工具?,php,python,c,Php,Python,C,我正在寻找一个命令行工具,从输入中删除所有注释 文件并返回剥离的输出。如果它支持流行音乐那就太好了 编程语言如C、C++、Python、PHP、JavaScript、HTML、CSS等。 必须具有语法意识,而不是基于regexp,因为后者将捕获 源代码字符串中的模式也是如此。有这样的工具吗 我充分意识到,评论是有用的信息,经常会留下它们 因为他们是一个好主意。只是我的重点放在不同的用例上。我不知道有这样一个工具,这和说没有一样 我曾经设计过一个,但它很快变得疯狂——没有被C和C++中的注释规则所

我正在寻找一个命令行工具,从输入中删除所有注释 文件并返回剥离的输出。如果它支持流行音乐那就太好了 编程语言如C、C++、Python、PHP、JavaScript、HTML、CSS等。 必须具有语法意识,而不是基于regexp,因为后者将捕获 源代码字符串中的模式也是如此。有这样的工具吗

我充分意识到,评论是有用的信息,经常会留下它们
因为他们是一个好主意。只是我的重点放在不同的用例上。

我不知道有这样一个工具,这和说没有一样

<>我曾经设计过一个,但它很快变得疯狂——没有被C和C++中的注释规则所帮助。

/\
*  Comment? *\
/
(回答:是的!)

(回答:没有!)

为了合理地开展工作,您必须了解:

  • 语言注释约定
  • 语言引用的字符串约定(Python和Perl足以让您发疯)
  • 转义约定(Shell将您带到这里-以及引号)
这些因素结合在一起,使得这项工作相当接近于不可能完成

我最后用一个程序SCC来删除C和C++注释。它的酷刑测试包括比上述评论更糟糕的例子——而且它做得不错。但是,将其扩展到shell、Perl、Python或(随便选)是非常重要的,我没有这么做。

,一个免费的Perl脚本,可以做到这一点

从源代码中删除注释 如何判断cloc是否正确识别注释?说服自己cloc做正确事情的一种方法是使用其
--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))