这里有一个简单的代码需要理解:
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 '.
发布于 2020-10-11 09:34:35
Arpeggio是建立在钉住形式主义的基础上的,它从不回溯成功的有序选择匹配。
维基百科PEG文章的引文如下:
上下文无关文法和解析表达式语法之间的根本区别在于,PEG的选择操作符是有序的。如果第一种选择成功,则第二种选择将被忽略。
因此,在有序选择RHS规则引用时,您必须小心。大拇指的规则是在前面放更多的特定的火柴。在您的例子中,line line更具体,应该先尝试。
https://stackoverflow.com/questions/64296835
复制相似问题