捕获后琶音不能回去

问题描述

这是一个易于理解的代码

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.NoMatch: Expected EOF at position (3,1) => ' A *B '.

解决方法

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

引自维基百科PEG文章:

上下文无关文法与解析表达文法之间的根本区别在于PEG的选择运算符是有序的。如果第一个选择成功,则第二个选择将被忽略。

因此,在按顺序选择中订购RHS规则参考时,必须要小心。经验法则是将更具体的匹配放在前面。对于您而言,line line更具体,应首先尝试。