3

为什么以下 Parslet 解析器不适用于解析逗号分隔的列表?当我解析时,它卡住并且不提供错误消息:

class TestParser < Parslet::Parser

  rule(:name) { match['a-z'].repeat >> str(',').maybe }
  rule(:names) { name.repeat }

  root(:names)

end

TestParser.new.parse_with_debug('tom,samantha,ricardo')  # hangs here

我知道“直到出现分隔符的 Parslet 词”,并且我知道如何以其他方式解析列表,但我不明白为什么上述方法不起作用。

4

1 回答 1

4

解释:

无限循环意味着您的解析器中有一个正在循环的规则,但它可以匹配一个空字符串。如果它消耗任何东西,您将不会获得无限循环。

在您的情况下:Repeat默认值Repeat(0)可以匹配零个字符。使Maybe逗号可选,因此name可以匹配而不消耗任何东西,所以它确实......重复。

解决方案:

  • 改为拨打name电话。repeat(1)

诊断:

查看我检测到这些无限循环的 Parslet 分支。

它在github上。(https://github.com/NigelThorne/parslet

我的分支在第二次循环时会抱怨,并且自上次迭代以来它没有消耗任何东西。(仅将其用于开发......因为在时间关键循环内有一个检查,所以执行速度较慢)

于 2014-08-04T21:57:28.287 回答