见标题。对于我正在编写的一个小工具,我想介绍一种简单的布尔过滤器语言,并决定“正确”地做到这一点并使用解析器生成器。在玩了一下 grako 之后,我发现我喜欢它并且很快就完成了过滤器语言(这也很好:))
现在的问题是,如果我想在其他计算机上使用该工具或将其提供给其他人,我首先必须以某种方式使 grako 可用,这有点麻烦,因为其他一切都是标准的 python3 东西。
我想通过共同打包必要的 grako 类是可能的,但这似乎有点混乱(许可会以任何方式提及)。也许我忽略了一些内置方法。
见标题。对于我正在编写的一个小工具,我想介绍一种简单的布尔过滤器语言,并决定“正确”地做到这一点并使用解析器生成器。在玩了一下 grako 之后,我发现我喜欢它并且很快就完成了过滤器语言(这也很好:))
现在的问题是,如果我想在其他计算机上使用该工具或将其提供给其他人,我首先必须以某种方式使 grako 可用,这有点麻烦,因为其他一切都是标准的 python3 东西。
我想通过共同打包必要的 grako 类是可能的,但这似乎有点混乱(许可会以任何方式提及)。也许我忽略了一些内置方法。
简短的回答是否。
Grako 生成的解析器确实需要该grako
库。
例如:
with self._group():
with self._choice():
with self._option():
self._token('nameguard')
with self._option():
self._token('ignorecase')
with self._option():
self._token('left_recursion')
self._error('expecting one of: ignorecase left_recursion nameguard')
所有的self._xyz()
都来自grako.contexts.ParseContext
或grako.parsing.Parser
。所需的回溯、缓存和簿记都隐藏在上下文管理器和装饰器后面。
生成依赖的解析器grako
是一种设计选择,旨在使解析器更小更容易理解,这是该项目的主要目标之一(因为有许多其他出色的解析器生成器会产生混淆代码)。
另一种选择是将生成的解析器可能依赖的代码复制到每个解析器上,但这似乎有点不合Python。