Грамматика.разбор, кажется, петля навсегда и использовать 100% CPU

репост от канал # perl6 IRC, jkramer, с разрешения

Я играю с грамматиками и пытаюсь разобрать файл в стиле ini, но как-то грамматику.разбор, кажется, цикл навсегда и использовать 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 ответов


маркер TOP имеет * Квантор на subregex, что может разобрать пустую строку (так как <comment> и группа, которая содержит <section> есть * Квантор самостоятельно).

если внутренний subregex соответствует пустой строке, он может делать это бесконечно много раз без продвижения курсора. В настоящее время Perl 6 не имеет защиты от такого рода ошибок.

мне кажется, вы могли бы упростить ваш код

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

(там нет необходимости во внешней группе [...]*, потому что последний <comment> также соответствует комментариям перед разделами.