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

时间:2018-04-12 15:44:27

标签: grammar perl6

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)

1 个答案:

答案 0 :(得分:7)

令牌TOP在子目标上具有*量词,可解析空字符串(因为<comment>和包含<section>的组都有* }量词自己)。

如果内部子规则匹配空字符串,它可以无限次地执行,而不会使光标前进。目前,Perl 6无法抵御此类错误。

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

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

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