Grammar.parse 似乎永远循环并使用 100% CPU

Grammar.parse seems to loop forever and use 100% CPU

转自the #perl6 IRC channel, by jkramer, with permission

我正在研究语法并尝试解析 ini 样式的文件,但不知何故 Grammar.parse 似乎永远循环并使用 100% CPU。知道这里出了什么问题吗?

grammar Format {
  token TOP {
    [
      <comment>*
      [
        <section>
        [ <line> | <comment> ]*
      ]*
    ]*
  }

  rule section {
    '[' <identifier> <subsection>? ']'
  }

  rule subsection {
    '"' <identifier> '"'
  }

  rule identifier {
    <[A..Za..z]> <[A..Za..z0..9_-]>+
  }

  rule comment {
    <[";]> .*? $$
  }

  rule line {
    <key> '=' <value>
  }

  rule key {
    <identifier>
  }

  rule value {
    .*? $$
  }
}

Format.parse('lol.conf'.IO.slurp)

Token TOP 在可以解析空字符串的子正则表达式上有 * 量词(因为 <comment> 和包含 <section> 的组都有 * 量词自己)。

如果内部子正则表达式匹配空字符串,它可以无限次匹配而不用移动光标。目前,Perl 6 没有针对此类错误的保护措施。

在我看来你可以将代码简化为

token TOP {
  <comment>*
  [
    <section>
    [ <line> | <comment> ]*
  ]*
}

(不需要[...]*的外组,因为最后的<comment>也匹配段前的注释。