去除 C/C++/Java 源代码中的注释: flex 词法分析源程序

发布: 2008-05-29 23:05

刚开始用 lex & yacc 写东西,今天偶然想到一个去掉C/C++/Java代码中注释的方法,顺便写了出来。


看了lex没几天,写的代码还比较生硬。


说明:


这个编译出来的程序有两个输出,一个是错误信息输出到了标准错误输出(stderr),一个是不处理过的不包含注释的源代码码到标准输出(stdout)。


可以使用下面的命令分别保存 stderr 和 stdout的输出:


./ucl < some_file.c   2>some_file_comment.txt       >some_file_clean.c


将下面的代码保存为 ucl.fl, 然后使用下面的命令编译: 


[code type="bash"]
flex -dv ucl.fl
gcc -o ucl lex.yy.c -lfl
./ucl < some_file.c
[/code]

 



[code type="c"]
%{

#include
#include
#include

char cmc_buffer[8096];
%}

%s CMCS STRING

%%

[/][/].*$ { fprintf(stderr,"%s", yytext); }

[/][*].*[*][/] { fprintf(stderr,"%s", yytext); }

[/][*] {
BEGIN (CMCS);
memset(cmc_buffer, 0, sizeof(cmc_buffer));
strcpy(cmc_buffer, yytext);
}

. {
cmc_buffer[strlen(cmc_buffer)] = yytext[0];
}

n {
cmc_buffer[strlen(cmc_buffer)] = yytext[0];
}

[*][/] {
strcat(cmc_buffer, yytext);
fprintf(stderr, "nCMC at line %d : n[[-------n%sn-----------]]n", yylineno, cmc_buffer);
BEGIN (INITIAL);
}

n { yylineno ++; ECHO ;}

["] {
BEGIN (STRING);
ECHO;
}
["] {
BEGIN (INITIAL);
ECHO;
}
. { ECHO ;}

. {
BEGIN (INITIAL);
ECHO ;
}

%%

/*
用法: flex -dv ucl.fl
gcc -o ucl lex.yy.c -lfl
./ucl < some_file.c
*/

int main(int argc, char **arg)
{
yylex();
return 0;
}

[/code]


原文: http://qtchina.tk/?q=node/133

Powered by zexport