是否可以在没有 grako 的情况下使用 grako 生成的解析器?
Is it possible to use a with grako generated parser without grako?
看标题。对于我正在编写的一个小工具,我想引入一种简单的布尔过滤器语言并决定这样做 "properly" 并使用 parser-generator。在与 grako 玩了一会儿之后,我发现我喜欢它并且很快就完成了 filter-language(这也很好 :))
现在的问题是,如果我想在其他计算机上使用该工具或将其提供给其他人,我首先必须以某种方式在那里提供 grako,这有点麻烦,因为其他一切都是标准的 python3东西。
我想 co-packaging 可能需要 grako-classes,但这似乎有点混乱(无论如何都会提到许可)。也许我忽略了一些built-in方法。
简短的回答是否。
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
是一种旨在使解析器更小且更易于理解的设计选择,这是该项目的主要目标之一(因为有许多其他方面非常出色的解析器生成器产生混淆代码)。
另一种选择是将生成的解析器可能依赖的代码复制到每个解析器上,但这似乎有点不符合 pythonic。
看标题。对于我正在编写的一个小工具,我想引入一种简单的布尔过滤器语言并决定这样做 "properly" 并使用 parser-generator。在与 grako 玩了一会儿之后,我发现我喜欢它并且很快就完成了 filter-language(这也很好 :))
现在的问题是,如果我想在其他计算机上使用该工具或将其提供给其他人,我首先必须以某种方式在那里提供 grako,这有点麻烦,因为其他一切都是标准的 python3东西。
我想 co-packaging 可能需要 grako-classes,但这似乎有点混乱(无论如何都会提到许可)。也许我忽略了一些built-in方法。
简短的回答是否。
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
是一种旨在使解析器更小且更易于理解的设计选择,这是该项目的主要目标之一(因为有许多其他方面非常出色的解析器生成器产生混淆代码)。
另一种选择是将生成的解析器可能依赖的代码复制到每个解析器上,但这似乎有点不符合 pythonic。