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

前端之家收集整理的这篇文章主要介绍了Grammar.parse似乎永远循环并使用100%的CPU前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
转自 the #perl6 IRC channel,by jkramer,with permission

我正在玩语法并试图解析一个ini风格的文件,但不知何故,Grammar.parse似乎永远循环并使用100%的cpu.任何想法在这里有什么问题?

  1. grammar Format {
  2. token TOP {
  3. [
  4. <comment>*
  5. [
  6. <section>
  7. [ <line> | <comment> ]*
  8. ]*
  9. ]*
  10. }
  11.  
  12. rule section {
  13. '[' <identifier> <subsection>? ']'
  14. }
  15.  
  16. rule subsection {
  17. '"' <identifier> '"'
  18. }
  19.  
  20. rule identifier {
  21. <[A..Za..z]> <[A..Za..z0..9_-]>+
  22. }
  23.  
  24. rule comment {
  25. <[";]> .*? $$
  26. }
  27.  
  28. rule line {
  29. <key> '=' <value>
  30. }
  31.  
  32. rule key {
  33. <identifier>
  34. }
  35.  
  36. rule value {
  37. .*? $$
  38. }
  39. }
  40.  
  41. Format.parse('lol.conf'.IO.slurp)

解决方法

Token TOP在subregex上具有可以解析空字符串的*量词(因为< comment>和包含< section>的组都有自己的*量词).

如果内部子规则匹配空字符串,它可以无限次地执行,而不会使光标前进.目前,Perl 6没有针对此类错误的保护.

在我看来,你可以简化你的代码

  1. token TOP {
  2. <comment>*
  3. [
  4. <section>
  5. [ <line> | <comment> ]*
  6. ]*
  7. }

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

猜你在找的Perl相关文章