琶音在捕捉后无法返回
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
更具体,应该首先尝试。
这里有一个简单的代码可以理解:
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
更具体,应该首先尝试。