我正在尝试从c文件中提取评论。但我的代码拉出了所有的星星,而不仅仅是/ *和* /。有人可以帮忙吗?
输入/**A**/
或/***/
所需输出*A*
和*
我的输出*A
,没有
代码
"/*" /* comment */ BEGIN(Comment);
<Comment>{
[^*] /* not a '*' */ ECHO;
"*"+[^/] /* '*'s not followed by '/' */ ECHO;
"*"+"/" /* end of Comment */ BEGIN(INITIAL);
}
答案 0 :(得分:1)
将最后两个模式更改为
"*"+/[^/]
"*/"
您的上一个模式明确地将评论末尾的每个*
从评论中删除。如果您只更改了最后一条规则,那么它将无法识别例如/***/
的评论结尾,因为/*
将启动评论,然后**
与一条评论相匹配最后一个模式,/
与[^*]
匹配。
"*"+/[^/]
匹配*
的所有序列,后跟除/
之外的任何内容,但不会消耗后面的字符。这是必要的,因为这可能是*
关闭评论的*/
。
答案 1 :(得分:0)
此正则表达式匹配非嵌套C注释:
"/*"([^*]|[*]*[^*/])*"*"+"/"
这是一个完整的Lex程序,它从输入中删除C注释,用空格替换每个注释。
%%
"/*"([^*]|[*]*[^*/])*"*"+"/" putc(' ', yyout);
%%
但是,这无法提供有用的诊断。例如,如果发生/* /* */
之类的事情,那么在评论中生成关于可疑的评论开始的警告是很好的。此外,如果评论未被终止,则检测该评论并生成诊断已开始的诊断非常有用。
由于这些原因,最好通过仅识别/*
序列来处理C注释,然后接管一段自定义代码,该代码读取yyin
流中的字符并识别其余部分评论。