【发布时间】:2016-06-04 13:16:13
【问题描述】:
我试图了解如何重新创建由grako 生成的解析器解析的文档。
在深入研究 grako 源代码之后,我相信我终于明白了如何从 AST 返回到生成的文档。有人可以检查我的以下理解是否正确,如果有更直接的方法,请告诉我?
- 创建一个希望解析的 PEG 语法。 Grako 创建了一个解析器类和一个基于它的语义类。
- 为语法中的每条规则创建(手动)一个包含(或多或少)一个单独的类(
grako.model.Node的子类)的 python 模块。每个类必须至少有一个构造函数,该构造函数为相应规则中的每个命名元素提供参数,并将其值存储在类属性中。 - 一个子类(手动)生成的语义类,以将每个规则的 ast 替换为在步骤 2 中创建的相应类。
- 一个人(手动)创建一个python模块,它是
grako.codegen.ModelRenderer的子类,为(或多或少)语法中的每个规则定义“代码”生成模板。 - 将由 Node 子类和包含模板的 python 模块组成的 AST 提供给
grako.codegen.CodeGenerator().render(...)以创建输出。
这是对的吗?这看起来一点也不直观。
- 为什么要经过第 2 步和第 3 步的重大努力,除了存储 AST 中已经包含的信息之外什么都不做?
- 与直接从 AST 工作相比,这种方法有什么优势?
- 如果只想以原始语法重新创建文档,是否有办法自动执行或回避步骤 2 和 3?
- 给定一个 PEG 语法定义,理论上是否可以像创建“解析器生成器”一样自动创建“代码生成器生成器”?
【问题讨论】:
标签: python code-generation grako