pypeg 不能用列表编写语法?

pypeg cannot compose grammar with list?

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

compose(parse('a', A))

解析正常时会引发 compose 错误。

我只能通过使用虚拟机来绕过它 class:

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

compose(parse('a', A2))

现在可以正确组合了。

这里有什么问题?

您在 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!
                                         ^^^^^^

我已经提交了 pull request 修复。