如何在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 */ }
以上要求终止* /;未终止的注释将强制词法分析器返回到注释的开头并接受一些其他令牌,通常是/ division运算符.这可能不是你想要的,但是从未经评论的评论中恢复并不容易,因为没有真正好的方法可以知道评论应该在哪里结束.因此,我建议添加错误规则:
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { /* DO NOTHING */ } [/][*] { fatal_error("Unterminated comment"); }