程序删除评论

时间:2014-10-17 21:49:01

标签: lex

我想在LEX中编写一个删除输入注释的程序。评论可以用这些方式写出来:

  • /*comment*/
  • //comment
  • /*comment /*comment*/ */

我的想法是: 如果输入以/*开头,则识别某种方式 - >然后我会查找/*并忽略其中的文字。如果输入以//开头,我将忽略它直到行结束。

但我不确切知道如何实现这一点。

1 个答案:

答案 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]; }