0

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

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

所需的输出*A**

我的输出*A,什么都没有

代码

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

2 回答 2

1

将最后两个模式更改为

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

您的最后一个模式明确地将*注释末尾的 every 从注释中取出。如果您只更改最后一条规则,那么它将无法识别例如注释的结尾/***/,因为/*将开始注释,然后**与最后一个模式匹配,并且由/匹配[^*]

"*"+/[^/]匹配除了 a 之外的所有序列,但不使用*后面的字符。/这是必要的,因为这可能是*关闭*/评论的。

于 2013-04-16T23:17:06.843 回答
0

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

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

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

%%

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

%%      

但是,这无法提供有用的诊断。例如,如果发生类似/* /* */的事情,最好在评论中生成关于评论开头可疑的警告。此外,如果注释未终止,则检测该注释并生成有关该诊断是否已启动的诊断很有用。

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

于 2013-04-16T23:54:18.713 回答