我希望能够解析两个(或任意数量)表达式,每个表达式都有自己的一组变量定义或其他上下文。在
似乎没有一种明显的方法可以将上下文与pyparsing.ParseExpression.parseString()
的特定调用关联起来。最自然的方法似乎是使用某个类的instancemethod作为解析操作。这种方法的问题是必须为每个解析上下文(例如,在类的__init__
)重新定义语法,这似乎非常低效。在
在规则上使用pyparsing.ParseExpression.copy()
没有帮助;单个表达式可以正常克隆,但是组成它们的子表达式没有以任何明显的方式更新,因此任何嵌套表达式的解析操作都不会被调用。在
我能想到的获得这种效果的唯一另一种方法是定义一个返回无上下文抽象解析树的语法,然后在第二步中处理它。即使对于简单的语法来说,这似乎也很尴尬:在使用未识别的名称时只引发一个异常是很好的,而且它仍然无法解析像C这样的语言,因为这些语言实际上需要上下文来知道哪条规则匹配。在
有没有另一种方法可以将上下文(当然不使用全局变量)注入到pyparsing表达式的解析操作中?在
像您所说的那样,让解析操作成为instancemethods,但不重新实例化类怎么样?相反,当您想解析另一个翻译单元时,请在同一个解析器对象中重置上下文。在
像这样:
在本例中,“symtab”是您的上下文。在
如果您尝试在不同的线程中进行并行解析,这将严重失败,但我不明白如何在共享解析操作中正常工作。在
有点晚了,但是google
pyparsing reentrancy
显示了这个主题,所以我的答案是。我已经解决了解析器实例重用/可重入的问题,方法是将上下文附加到正在解析的字符串上。 子类
str
,将上下文放入新str类的属性中, 将它的一个实例传递给pyparsing
,并在操作中获取上下文。在Python 2.7:
收益率
^{pr2}$这种方法使})和一些monkeypatching。在我的数据集中,这根本不是问题,因为性能损失可以忽略不计,这甚至有利于内存的使用。在
Parser
本身完全可重用和可重入。 只要不接触pyparsing
的静态字段,pyparsing
内部通常也是可重入的。 唯一的缺点是pyparsing
在每次调用parseString
时重置其packrat缓存,但这可以通过 重写SpecStr.__hash__
(使其像object
那样散列,而不是{我不知道这是否一定能回答您的问题,但这是根据上下文定制解析器的一种方法:
印刷品
^{pr2}$相关问题 更多 >
编程相关推荐