问题描述
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
更具体,应首先尝试。