从https://irclog.perlgeek.de/perl6/2018-04-12#i_16038822转发
我正在玩语法,并试图解析一个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)发布于 2018-04-12 15:59:21
Token TOP在子正则表达式上有*量化符,可以解析空字符串(因为<comment>和包含<section>的组都有自己的*量化符)。
如果内部子正则表达式与空字符串匹配,则可以在不推进游标的情况下进行无限多次。目前,Perl 6没有针对此类错误的保护。
在我看来,你可以简化你的代码
token TOP {
<comment>*
[
<section>
[ <line> | <comment> ]*
]*
}(不需要[...]*的外部组,因为最后一个<comment>也与节之前的注释匹配。
https://stackoverflow.com/questions/49800790
复制相似问题