琶音在捕捉后无法返回

Arpeggio can't go back after a catch

这里有一个简单的代码可以理解:

def line(): return _(r".+")
def start(): return [line, (line, line)], EOF

parser = ParserPython(start, debug=True)

input_expr = """
A
B
"""

parse_tree = parser.parse(input_expr)

这里,在规则start中,它应该先尝试捕获一条线,如果它不起作用,则尝试捕获两条线。但是 Arpeggio 好像没有这个功能。我得到 arpeggio.NoMatch: Expected EOF at position (3, 1) => ' A *B '.

琶音基于 PEG 形式主义,它从不回溯成功的有序选择匹配。

引自维基百科 PEG 文章:

The fundamental difference between context-free grammars and parsing expression grammars is that the PEG's choice operator is ordered. If the first alternative succeeds, the second alternative is ignored.

因此,在有序选择中订购 RHS 规则参考时必须小心。经验法则是将更具体的匹配放在前面。在你的情况下 line line 更具体,应该首先尝试。