【问题标题】:Is it possible to use a with grako generated parser without grako?是否可以在没有 grako 的情况下使用 with grako 生成的解析器?
【发布时间】:2016-03-18 19:17:52
【问题描述】:

见标题。对于我正在编写的一个小工具,我想介绍一种简单的布尔过滤器语言,并决定“正确”地做到这一点并使用解析器生成器。在玩了一下 grako 之后,我发现我喜欢它并且很快就完成了过滤器语言(这也很好:))

现在的问题是,如果我想在其他计算机上使用该工具或将其提供给其他人,我首先必须以某种方式使 grako 可用,这有点麻烦,因为其他一切都是标准的 python3 东西。

我想通过共同打包必要的 grako 类是可能的,但这似乎有点混乱(许可会以任何方式提及)。也许我忽略了一些内置方法。

【问题讨论】:

  • 有时解析器生成器是多余的。如果您只想编写一个简单的布尔表达式语言,您可以使用手写的递归下降解析器非常有效地做到这一点,并且没有外部包依赖项。见stackoverflow.com/questions/2245962/…
  • 感谢提示。我同意,为此使用生成器可能有点过头了,但这只是一个“为了好玩”的东西,我确实使用了一个,只是因为我已经有一段时间没有玩过任何东西了;-)。

标签: python python-3.x parser-generator grako


【解决方案1】:

简短的回答是

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.ParseContextgrako.parsing.Parser。所需的回溯、缓存和簿记都隐藏在上下文管理器和装饰器之后。

让生成的解析器依赖于grako 是一种设计选择,旨在使解析器更小且更易于理解,这是该项目的主要目标之一(因为有许多其他出色的解析器生成器会生成混淆代码)。

另一种选择是将生成的解析器可能依赖的代码复制到每个解析器上,但这似乎有点不合 Python。

【讨论】:

  • 澄清:不必学习 Grako 库来构建解析器或翻译器:README 就足够了。但是......要处理复杂的源语言或目标语言,最好是使用者研究 Grako 库在这方面提供的内容,或者找到其他同等或更好的来源。
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2014-06-16
  • 2020-01-22
相关资源
最近更新 更多