【问题标题】:Explanation of JFlex Block Comment ruleJFlex Block Comment 规则说明
【发布时间】:2021-05-23 15:48:49
【问题描述】:

我正在研究如何在 JFlex 中实现 block cmets 以获得 intellij 中的自定义语言支持,发现它可以描述为

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

我不太明白如何阅读这篇文章,希望能用简单的英语解释一下。

目前我正在阅读这篇文章

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

【问题讨论】:

  • 看起来[^] 将匹配任何字符,包括换行符,这就是他们可能使用它的原因

标签: flex-lexer jflex


【解决方案1】:

您基本上已经正确解读了它。以下是一些解释性说明:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2011-01-14
    相关资源
    最近更新 更多