lex - 删除“/ *”也会删除内部星星

时间:2013-04-16 16:36:55

标签: lex

我正在尝试从c文件中提取评论。但我的代码拉出了所有的星星,而不仅仅是/ *和* /。有人可以帮忙吗?

输入/**A**//***/

所需输出*A**

我的输出*A,没有

代码

"/*"    /* comment */ BEGIN(Comment);
<Comment>{
    [^*]         /* not a '*' */ ECHO;
    "*"+[^/]      /* '*'s not followed by '/' */ ECHO;
    "*"+"/"       /* end of Comment */ BEGIN(INITIAL);
}

2 个答案:

答案 0 :(得分:1)

将最后两个模式更改为

"*"+/[^/]
"*/"

您的上一个模式明确地将评论末尾的每个*从评论中删除。如果您只更改了最后一条规则,那么它将无法识别例如/***/的评论结尾,因为/*将启动评论,然后**与一条评论相匹配最后一个模式,/[^*]匹配。

"*"+/[^/]匹配*的所有序列,后跟除/之外的任何内容,但不会消耗后面的字符。这是必要的,因为这可能是*关闭评论的*/

答案 1 :(得分:0)

此正则表达式匹配非嵌套C注释:

"/*"([^*]|[*]*[^*/])*"*"+"/"

这是一个完整的Lex程序,它从输入中删除C注释,用空格替换每个注释。

%%

"/*"([^*]|[*]*[^*/])*"*"+"/" putc(' ', yyout);

%%      

但是,这无法提供有用的诊断。例如,如果发生/* /* */之类的事情,那么在评论中生成关于可疑的评论开始的警告是很好的。此外,如果评论未被终止,则检测该评论并生成诊断已开始的诊断非常有用。

由于这些原因,最好通过仅识别/*序列来处理C注释,然后接管一段自定义代码,该代码读取yyin流中的字符并识别其余部分评论。