1
class A(List):
    grammar = [(Symbol, ':', Symbol), Symbol]

compose(parse('a', A))

这引发了一个compose错误。

我只能通过使用虚拟类绕过它:

class B(List):
    grammar = Symbol, ':', Symbol
class A2(List):
    grammar = [B, Symbol]

compose(parse('a', A2))

现在它组成正确。

这里有什么问题?

4

1 回答 1

1

您在 pyPEG 中发现了一个错误。

组合List对象时,pyPEG 使用堆栈来跟踪接下来应该组合哪个列表项。语法中的元组从堆栈中删除项目,但从不将它们放回原处,即使元组匹配失败。当代码尝试访问空堆栈中的元素时,这会导致 IndexError。

对于您的示例,它看起来像这样:

    Stack                    Grammar                      Action                
-----------------------------------------------------------------------
[Symbol('a')]    [(Symbol, ':', Symbol), Symbol]    matched, pop stack
                   ^^^^^^

[]               [(Symbol, ':', Symbol), Symbol]    str, append to text
                           ^^^

[]               [(Symbol, ':', Symbol), Symbol]    no match
                                ^^^^^^

[]               [(Symbol, ':', Symbol), Symbol]    IndexError!
                                         ^^^^^^

我已经提交了一个带有修复的拉取请求。

于 2016-12-31T06:56:15.480 回答