JFlex 块注释规则说明

问题描述

我正在研究如何在 jflex 中实现块注释以在 intellij 中实现自定义语言支持,发现它可以描述为

"/*" !([^]* "*/" [^]*) ("*/")?

我不太明白如何阅读这篇文章,如果能用简单的英语解释,我会很高兴。

目前我正在阅读本文

  • 首先期待 /* 然后
  • 预计不会
    • 任何字符? (不知道他们为什么使用 [^])零次或多次
    • 关注了*/
    • 任何零个或多个字符
  • 可选的 */

解决方法

你基本上已经正确地破译了。以下是一些解释性说明:

[^]* 匹配任意字符序列。它与 .* 类似,只是 . 不匹配换行符或未配对的代理; [^] 绝对匹配任何内容。

所以 ([^]* "*/" [^]*) 匹配任何包含 */ 的序列。因此 !([^]* "*/" [^]*) 匹配除包含 */ 的序列之外的任何内容。换句话说,它匹配最多但不包括 */ 的任何内容,这是评论的其余部分。

现在如果用户犯了错误忘记关闭最后一条评论会发生什么?在这种情况下,没有 */ 并将匹配到输入的末尾。由于没有办法知道注释应该在哪里结束(无法读懂程序员的想法),我们能做的最好的事情就是停止尝试解析。因此,我们接受未终止的评论作为评论。这就是为什么最后的 "*/"? 是可选的。如果有则匹配注释终止符,否则匹配输入末尾的空序列。