1

这是一个简单的语法:

filling = fill? align
fill = .
align = [<>=^]

它应该匹配以下内容:

<
0<
<<

但是,PEG.js 不允许回溯,fill只是消耗了<字符:

<    (does not work)
0<   (works)
<<   (works)

我应该如何修改语法以使其工作?

4

1 回答 1

2

PEG.js 不允许回溯

这并不完全正确。以下代码可以按您的意愿工作:

filling = fill align / align

这有效而版本?无效的原因是回溯仅在单个规则中对备选方案执行。也就是说,如果一个备选方案失败,解析器将回溯并尝试下一个备选方案,直到备选方案匹配或所有备选方案都用尽。但是解析器没有做的是在已经成功的子规则中尝试其他替代方案。所以在 中fill? align,如果fill?通过匹配成功,则在之后不匹配<时,它不会尝试匹配空字符串的替代方案align。但是在 中fail align / align,如果fail align因为失败而align失败,它会尝试下一个替代方案,然后成功。

这种行为意味着您通常可以通过内联子规则或在本例中通过“内联”运算符(如?.

于 2017-11-28T02:47:23.693 回答