为什么下面的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)
我的分支在第二次遍历循环时会抱怨,而且自上次迭代以来它没有消耗任何东西。(仅用于开发…因为在时间临界循环内有一个检查,所以执行速度较慢)