这是一个简单的语法:
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
失败而失败,它确实尝试了下一个替代方案,然后成功。
这种行为意味着您通常可以通过内部插入子插曲或在这种情况下(如?
)。