- 论坛徽章:
- 0
|
原始讨论贴见:
http://bbs.chinaunix.net/viewthread.php?tid=846353&extra=page%3D1
http://bbs.chinaunix.net/viewthread.php?tid=846682&extra=page%3D1
http://bbs.chinaunix.net/viewthread.php?tid=846685&extra=page%3D1
感谢大家的热情参与!我把符合基本要求的方法统一汇总到这里,方便大家分析和比较各种方法的优劣。
对于方法需要满足的基本要求,目前暂定为能够处理以下5种形式的c语言注释:
- 1. /* aaaaaaaaaaaaaaaaaaaaaaaaa
- bbbbbbbbbbbbbbbbbbbbbbbbb
- ccccccccccccccccccccccccc */
-
- 2. /* ddddddddddddddddddddddddd */
-
- 3. int foo; /* eeeeeeeeeeeeeeeee */
-
- 4. /* ffffffffffffffff */ int bar;
-
- 5. int foobar; /* gggggggggggggggg
- hhhhhhhhhhhhhhhh
- iiiiiiiiiiiiiiii */
复制代码
大家提出的方法我会尽快验证,已经通过验证的方法如下(按方法大类组织):
【雨丝风片】,awk脚本:
- BEGIN { del = 0 }
- /\/\*.*\*\// { sub(/\/\*.*\*\//, "") }
- /\/\*/ { del = 1; sub(/\/\*.*$/, ""); if (!match($0, /^ *$/)) print }
- /\*\// { del = 0; next }
- /^ *$/ { next }
- del == 0 { print }
复制代码
【congli】,awk脚本:
- BEGIN { del = 0; d = 0 }
- /\/\*.*\*\// { sub(/\/\*.*\*\//,"") }
- /.*\/\*/ { sub(/\/\*.*\*\//,"") }
- /^\/\*/ { del = 1; d=1 }
- {if (d==1) { del = 1 } else { del = 0}}
- /\*\// { if (d==1) { d=0 ; next } }
- /.*\/\*.*/ { sub(/\/\*.*/,""); d=1 }
- /^ *$/ { next }
- del == 0 { print }
复制代码
【waker】,awk:
- awk 'BEGIN{RS="/\*|\*/"} NR%2' foo.c
复制代码
【woodie】,awk:
- awk -vRS='/\\*|\\*/' -vORS="" '!c;RT=="/*"{c++}RT=="*/"{c--}'
复制代码
【woodie】,awk:
- awk -vRS='/\\*|\*/' -vORS="" '{sub(/\/\/.*\n/, "")}!c;RT=="/*"{c++}RT=="*/"{c--}'
复制代码
【awk就是awp加ak】,awk:
- awk '
- function clearComment(){
- if ($0~/\/\*/){
- if ($0~/\*\//) sub(/\/\*.*\*\//, "");
- else sub(/\/\*.*/, "");
- print;
- while (getline == 1 && !($0~/\*\//));
-
- sub(/.*\*\//, "");
- } else if ($0~/\/\//) sub(/\/\/.*/, "");
- if ($0~/\/\*/) clearComment();
- else print;
- }
- {
- clearComment();
- }' foo.c
复制代码
【awk就是awp加ak】,sed:
- sed '
- s%//.*%%
- /\/\*/{
- :next
- N
- /\*\//!b next
- s%/\*.*\*/%^M%
- }
- /\/\*/b next
- ' foo.c
复制代码
【qqq112233g】,sed:
- sed -n 'H;${g;s#/\*[^*]*\*/##g;s/\n *\n//g;p}' foo.c
复制代码
【lovesaka】,perl:
- perl -ne 'if(/\/\*/&&/\*\//||/^$/){print if(s/\/\*.*\*\/// && !/^\s+$/);next}elsif(/\/\*/){$flag=1;print if(s/\/\*.*$// && !/^\s+$/); next}elsif(/\*\//){$flag=0;print if(s/^.*\*\/// && !/^\s+$/);next}else{next if($flag);print}' foo.c
复制代码
【windwiny】,perl脚本:
- #!/usr/bin/perl -w
- # move C/C++ source file all comment
- # CopyError(R) windwiny. #### NO ANY WARRANTY ####
- #
- # Usage:
- # mvcommen.pl < aaa.c > bbb.c
- #
- $cc1=0; # line comment and \ ended;
- $cc2=0; # block comment begin but no end blocked.
- while (<>)
- {
- # aaa // bbb ccc \
- # ddd eee \
- # fff
- if ($cc1 !=0)
- {
- if (m/(.*)(\\$)/)
- {
- next;
- }
- else
- {
- $cc1=0;
- next;
- }
- }
- if (s/(.*?)(\/\/.*)(\\$)/$1/)
- {
- print ;
- $cc1=1;
- next;
- }
-
- # aaa // bbb ccc // ddd /* eee */ ... except above 's case
- s/(.*?)(\/\/.*$)/$1/; # NOT next
- # aaa /* bbb ccc
- # ddd eee
- # fff */ ggg
- if ($cc2 !=0)
- {
- # ? WARRING: disable /* /* */ */'s style comment
- if (s/(.*?)(\*\/)(.*)/$3/)
- {
- print ;
- $cc2=0;
- next;
- }
- next;
- }
- # aaa /* bbb */ ccc
- if (s/(.*?)(\/\*.*?\*\/)(.*)/$1$3/)
- {
- print ;
- next;
- }
- # --> join up #### CAN NOT move above 's if above ####
- if (s/(.*?)(\/\*.*$)/$1/)
- {
- print ;
- $cc2=1;
- next;
- }
- # Other case:
- # aaa /* bbb
- # ccc */ ddd; /* eee */ or // fff
- # This is too BT,can not moved. :-(
- # default
- print;
- }
- # vim:ts=4:sts=4:sw=4:cin
复制代码
【Namelessxp】,perl脚本:
- #!/usr/bin/perl
- use warnings;
- use strict;
- $/ = undef;
- while (<>){
- $_ =~ s/\/\*.*?\*\///igs;
- $_ =~ s/(\r?\n)+/\n/igs;
- print;
- }
- exit;
复制代码
【li-jiahuan】,perl:
- perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
复制代码
【li-jiahuan】,perl脚本:
- $/ = undef;
- $_ = <>;
- s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|\n+|.[^/"'\\]*)#$2#g;
- print;
复制代码
【mq110】,lex脚本:
- %{
- #include <stdio.h>
- void comment();
- int yywrap()
- {
- return 1;
- }
- %}
- %%
- "/*" {comment(); }
- . {printf("%c",yytext[0]);}
- %%
- void comment()
- {
- for(;;)
- {
- while (input()!='*');
- if(input()!='/')
- unput(yytext[yyleng-1]);
- else
- return;
- }
- }
复制代码
【gvim】,lex脚本:
- %{
- %}
- comment "/*"([^\*]|(\*)*[^\*/])*(\*)*"*/"
- %%
- {comment} { }
- %%
复制代码
【emacsnw】,c程序:
- /*
- * Removes comments from C codes.
- */
- #include <stdio.h>
- typedef enum {
- FA_NORMAL, /* normal texts */
- FA_QUOTE, /* inside a string */
- FA_META, /* meta character \ */
- FA_BSLASH, /* after / */
- FA_COMMENT, /* inside comments */
- FA_STAR /* after * */
- } FA_STATE;
- int main(int argc, char *argv[])
- {
- FILE *fp;
- int ch;
- FA_STATE state;
- if (argc < 2) {
- fprintf(stderr, "Not enough arguments.\n"
- "Must specify the C source file.\n");
- exit(-1);
- }
- if ((fp = fopen(argv[1], "r")) == NULL) {
- fprintf(stderr, "Can't open %s.\n", argv[1]);
- exit(-1);
- }
- state = FA_NORMAL;
- while ((ch = fgetc(fp)) != EOF) {
- switch (state) {
- start_over:
- case FA_NORMAL:
- if (ch == '"') {
- putchar(ch);
- state = FA_QUOTE;
- } else if (ch == '/')
- state = FA_BSLASH;
- else
- putchar(ch);
- break;
- case FA_QUOTE:
- if (ch == '\\') {
- putchar(ch);
- state = FA_META;
- } else if (ch == '"') {
- putchar(ch);
- state = FA_NORMAL;
- } else
- putchar(ch);
- break;
- case FA_META:
- putchar(ch);
- state = FA_QUOTE;
- break;
- case FA_BSLASH:
- if (ch == '*')
- state = FA_COMMENT;
- else {
- putchar('/'); /* restore the previous ch */
- state = FA_NORMAL;
- goto start_over;
- }
- break;
- case FA_COMMENT:
- if (ch == '*')
- state = FA_STAR;
- break;
- case FA_STAR:
- if (ch == '/')
- state = FA_NORMAL;
- else if (ch == '*')
- state = FA_STAR;
- else
- state = FA_COMMENT;
- break;
- }
- }
- exit(0);
- }
复制代码
期待大家继续提出其它的解决方法!
[ 本帖最后由 雨丝风片 于 2006-10-26 08:35 编辑 ] |
|