问题描述
我正在研究如何在 jflex 中实现块注释以在 intellij 中实现自定义语言支持,发现它可以描述为
"/*" !([^]* "*/" [^]*) ("*/")?
我不太明白如何阅读这篇文章,如果能用简单的英语解释,我会很高兴。
目前我正在阅读本文
- 首先期待
/*
然后 - 预计不会
- 任何字符? (不知道他们为什么使用
[^]
)零次或多次 - 关注了
*/
- 任何零个或多个字符
- 任何字符? (不知道他们为什么使用
- 可选的
*/
解决方法
你基本上已经正确地破译了。以下是一些解释性说明:
[^]*
匹配任意字符序列。它与 .*
类似,只是 .
不匹配换行符或未配对的代理; [^]
绝对匹配任何内容。
所以 ([^]* "*/" [^]*)
匹配任何包含 */
的序列。因此 !([^]* "*/" [^]*)
匹配除包含 */
的序列之外的任何内容。换句话说,它匹配最多但不包括 */
的任何内容,这是评论的其余部分。
现在如果用户犯了错误忘记关闭最后一条评论会发生什么?在这种情况下,没有 */
并将匹配到输入的末尾。由于没有办法知道注释应该在哪里结束(无法读懂程序员的想法),我们能做的最好的事情就是停止尝试解析。因此,我们接受未终止的评论作为评论。这就是为什么最后的 "*/"?
是可选的。如果有则匹配注释终止符,否则匹配输入末尾的空序列。