我应该如何修改语法以允许可选的表达式而无需回溯



这是一个简单的语法:

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失败而失败,它确实尝试了下一个替代方案,然后成功。

这种行为意味着您通常可以通过内部插入子插曲或在这种情况下(如?)。

最新更新