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 修复。
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 修复。