Grammar.parse 似乎永远循环并使用 100% CPU
Grammar.parse seems to loop forever and use 100% CPU
转自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)
Token TOP
在可以解析空字符串的子正则表达式上有 *
量词(因为 <comment>
和包含 <section>
的组都有 *
量词自己)。
如果内部子正则表达式匹配空字符串,它可以无限次匹配而不用移动光标。目前,Perl 6 没有针对此类错误的保护措施。
在我看来你可以将代码简化为
token TOP {
<comment>*
[
<section>
[ <line> | <comment> ]*
]*
}
(不需要[...]*
的外组,因为最后的<comment>
也匹配段前的注释。
转自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)
Token TOP
在可以解析空字符串的子正则表达式上有 *
量词(因为 <comment>
和包含 <section>
的组都有 *
量词自己)。
如果内部子正则表达式匹配空字符串,它可以无限次匹配而不用移动光标。目前,Perl 6 没有针对此类错误的保护措施。
在我看来你可以将代码简化为
token TOP {
<comment>*
[
<section>
[ <line> | <comment> ]*
]*
}
(不需要[...]*
的外组,因为最后的<comment>
也匹配段前的注释。