FLEX&BISON:去除C代码注释和其中的多余空行

使用两个flex程序来完成。

去除注释flex代码文件flex1:

%option noyywrap
%x COMMENT

%{
%}
%%
"//".* {}
"/*" {BEGIN COMMENT;}
<COMMENT>"*/" {BEGIN INITIAL;}
<COMMENT>. {}
. {printf("%s", yytext);}
%%

int main(int argc, char *argv[]){
    const char *input_filename = "input";
    if (argc == 2){ 
        input_filename = argv[1];
    }   
    yyin = fopen(input_filename, "r");
    yylex();
    fclose(yyin);
    return 0;
}

去除多余空行(连续的多行空行会被合并为一个空行)代码文件flex2

%option noyywrap
%x COMMENT

%{
int num_newline = 0;
%}
%%
^[ \t\n]+ {if (num_newline == 0){++num_newline; printf("\n");}}
. {printf("%s", yytext); num_newline = 0;} 
%%

int main(int argc, char *argv[]){
    const char *input_filename = "input";
    if (argc == 2){ 
        input_filename = argv[1];
    }   
    yyin = fopen(input_filename, "r");
    if (!yyin){
        perror("failed to open file\n");
        return -1; 
    }   
    yylex();
    fclose(yyin);
    return 0;
}

编译:

flex -o c1 flex1
gcc -o exe1 c1
flex -o c2 flex2
gcc -o exe2 c2

测试:

./exe1 input > tmp
./exe2 tmp > output

output中的代码以及没有了注释和多余空行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值