我想在LEX中编写一个删除输入注释的程序。评论可以用这些方式写出来:
/*comment*/
//comment
/*comment /*comment*/ */
我的想法是:
如果输入以/*
开头,则识别某种方式 - >然后我会查找/*
并忽略其中的文字。如果输入以//
开头,我将忽略它直到行结束。
但我不确切知道如何实现这一点。
答案 0 :(得分:1)
Lex模式本身无法处理嵌套注释,因此您需要处理与Lex状态嵌套的递归性质(或编写递归下降解析器)。
使用lex,使用状态堆栈管理例程(yy_push_state()
,yy_pop_state()
和yy_top_state()
)
简单示例:
%x BLOCKCOMMENT
"/*" { yy_push_state(BLOCKCOMMENT); }
<BLOCKCOMMENT>"*/" { if(yy_top_state() == BLOCKCOMMENT)
yy_pop_state();
else
fprintf(stderr,
"Error: comment close `*/` found while not in comment\n");
}
<BLOCKCOMMENT>. { /* consume */ }
. { return yytext[0]; }