pypeg不能用列表组成语法?

时间:2016-10-07 17:39:24

标签: python parsing peg pypeg

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))

现在它组成正确。

这里有什么问题?

1 个答案:

答案 0 :(得分: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!
                                         ^^^^^^

我已经提交了pull request修复程序。