从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)
答案 0 :(得分:7)
令牌TOP
在子目标上具有*
量词,可解析空字符串(因为<comment>
和包含<section>
的组都有*
}量词自己)。
如果内部子规则匹配空字符串,它可以无限次地执行,而不会使光标前进。目前,Perl 6无法抵御此类错误。
在我看来,您可以将代码简化为
token TOP {
<comment>*
[
<section>
[ <line> | <comment> ]*
]*
}
(不需要[...]*
的外部群组,因为最后<comment>
也匹配部分之前的注释。