我如何在 Flex 中检测像 //
这样的一行注释并跳过这些行?
此外,对于 /*
注释,以下代码片段是否足够?
"/*" { comment(); }
%%
comment()
{
char c, c1;
loop:
while ((c = input()) != '*' && c != 0)
putchar(c);
if ((c1 = input()) != '/' && c != 0)
{
unput(c1);
goto loop;
}
if (c != 0)
putchar(c1);
}
最佳答案
为什么不直接使用正则表达式来识别评论? lex/flex
的全部意义在于让您不必手动编写词法扫描器。您提供的代码应该可以工作(如果您将模式 /*
放在行的开头),但它有点难看,而且它是否会工作并不明显。
你的问题说你想跳过评论,但你提供的代码使用 putchar()
来打印评论,除了开头的 /*
。你想做什么?如果您想回应评论,您可以使用 ECHO
操作而不是什么都不做。
这里是正则表达式:
单行注释
这很简单,因为在 lex/flex 中,.
不会匹配换行符。所以下面会匹配从//
到行尾,然后什么都不做。
"//".* { /* DO NOTHING */ }
多行注释
这有点棘手,而且 * 是正则表达式字符以及注释标记的关键部分这一事实使得以下正则表达式有点难以阅读。我使用 [*]
作为识别字符 * 的模式;在 flex/lex 中,您可以使用 "*"
代替。使用您认为更具可读性的任何一个。本质上,正则表达式匹配以 *(的字符串)结尾的字符序列,直到找到下一个字符为 / 的字符。换句话说,它与您的 C 代码具有相同的逻辑。
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ }
上面需要终止*/
;未终止的注释将迫使词法分析器返回到注释的开头并接受一些其他标记,通常是 / 除法运算符。这可能不是您想要的,但要从未终止的评论中恢复过来并不容易,因为没有真正好的方法可以知道评论应该在哪里结束。因此,我建议添加错误规则:
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ }
[/][*] { fatal_error("Unterminated comment"); }
关于c - 使用 Flex 检测和跳过行注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395251/