为什么下面的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 word until delimeter present”,我知道如何用其他方式解析列表,但我不明白为什么上面的方法不起作用。

最佳答案

说明:
无限循环意味着您在解析器中有一个循环的规则,但它可以与空字符串匹配。如果它消耗了任何东西,就不会得到无限循环。
在您的情况下:Repeat默认为Repeat(0),可以匹配零个字符。Maybe使逗号成为可选的,因此name可以匹配而不消耗任何东西,因此它确实…反复地。
解决方案:
改为呼叫。
Diagnosis:
看看我的小菜叉,它能探测到这些无限循环。
在Github上。(https://github.com/NigelThorne/parslet
我的分支在第二次遍历循环时会抱怨,而且自上次迭代以来它没有消耗任何东西。(仅用于开发…因为在时间临界循环内有一个检查,所以执行速度较慢)

10-07 19:04
查看更多