注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[flex] 过滤 c comment  

2010-10-30 08:09:09|  分类: compiler |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
将 C 中的 /* ... */ 注释干掉。

%x COMMENT,给 flex 增加了一个 state。通过 BEGIN(state) 进入某个 state,则以 <state> 开头的 pattern 就会启用。
flex 默认的 state 是 INITIAL。

通过 <COMMENT>.|\n 吃掉 /* */ 之间的所有字符。

%noyywrap 可以让最后编译的时候 gcc lex.yy.c -lfl 去掉 -lfl 选项。
%yylineno 会多一个 yylineno 的变量,碰到 \n 则自动 yylineno++。

\n                  { ECHO; yylineno++; }
.                   { ECHO; }
当没有任何 pattern 匹配时,则启用这两条规则。写出来只是更明了些。

===================== commen.l =======================
%option noyywrap yylineno
%x COMMENT

%{
#include <stdio.h>

const char *curfile;
%}

%%

"/*"                { BEGIN(COMMENT); }
<COMMENT>"*/"       { BEGIN(INITIAL); }
<COMMENT>.|\n
<COMMENT><<EOF>>    { printf("%s:%d: unterminated comment\n", curfile, yylineno); yyterminate(); }

\n                  { ECHO; yylineno++; }
.                   { ECHO; }

%%

void parse_one_file(const char *file)
{
    YY_BUFFER_STATE bs;
    FILE *fp;

    curfile = file;
    fp = fopen(file, "r");
    bs = yy_create_buffer(fp, YY_BUF_SIZE);
    yy_switch_to_buffer(bs);

    yylex();

    yy_delete_buffer(bs);
    fclose(fp);
}

int main(int argc, char *argv[])
{
    int i;

    if ( argc < 2 ) {
        fprintf(stderr, "usage: ./a.out filename\n");
        return 1;
    }

    for ( i = 1; i < argc; i++ )
        parse_one_file(argv[i]);

    return 0;
}
======================================================
$ flex comment.l
$ gcc -Wall lex.yy.c
$ ./a.out xxx.c
======================================================

<COMMENT>.|\n 每次只"吃掉"一个字符,可以这样写 <COMMENT>([^*]|\n)+|. 每次吃掉一串字符。
([^*]|\n)+ 只要不碰到 * 号,则可以匹配一串字符或换行,加快 pattern-match 的速度。

我们再把匹配规则改一下,则支持 nested comment。
"/*"                { comment_recursive_cnt++; BEGIN(COMMENT); }
<COMMENT>"/*"       { comment_recursive_cnt++; }
<COMMENT>"*/"       { comment_recursive_cnt--; if (comment_recursive_cnt <= 0) BEGIN(INITIAL); }
<COMMENT>.|\n
<COMMENT><<EOF>>    { printf("%s:%d: unterminated comment\n", curfile, yylineno); yyterminate(); }
  评论这张
 
阅读(1164)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017