这是一个简单的语法:
filling = fill? align
fill = .
align = [<>=^]
它应该匹配以下内容:
<
0<
<<
但是,PEG.js 不允许回溯,fill
只是消耗了<
字符:
< (does not work)
0< (works)
<< (works)
我应该如何修改语法以使其工作?
PEG.js 不允许回溯
这并不完全正确。以下代码可以按您的意愿工作:
filling = fill align / align
这有效而版本?
无效的原因是回溯仅在单个规则中对备选方案执行。也就是说,如果一个备选方案失败,解析器将回溯并尝试下一个备选方案,直到备选方案匹配或所有备选方案都用尽。但是解析器没有做的是在已经成功的子规则中尝试其他替代方案。所以在 中fill? align
,如果fill?
通过匹配成功,则在之后不匹配<
时,它不会尝试匹配空字符串的替代方案align
。但是在 中fail align / align
,如果fail align
因为失败而align
失败,它会尝试下一个替代方案,然后成功。
这种行为意味着您通常可以通过内联子规则或在本例中通过“内联”运算符(如?
.