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))
现在它组成正确。
这里有什么问题?
答案 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修复程序。