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