- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图了解如何重新创建由 grako 生成的解析器解析的文档.
在深入研究 grako 源代码之后,我相信我终于理解了如何从 AST 返回到生成的文档。有人可以检查我的以下理解是否正确,让我知道是否有更直接的方法?
grako.model.Node
的子类)。每个类必须至少有一个构造函数,其中包含相应规则中每个命名元素的参数,并将其值存储在类属性中。grako.codegen.ModelRenderer
的一个子类,定义了一个人的语法中(或多或少)每个规则的“代码”生成模板。 grako.codegen.CodeGenerator().render(...)
以创建输出。这是对的吗?这看起来一点也不直观。
最佳答案
如果您查看 Grako 本身如何解析语法,您会注意到步骤 2 类是由 ModelBuilderSemantics
后代综合创建的:
# from grako/semantics.py
class GrakoSemantics(ModelBuilderSemantics):
def __init__(self, grammar_name):
super(GrakoSemantics, self).__init__(
baseType=grammars.Model,
types=grammars.Model.classes()
)
self.grammar_name = grammar_name
self.rules = OrderedDict()
...
如果 types=
参数中没有出现类,则这些类被合成。 ModelBuilderSemantics
所需要的只是每个语法规则都带有一个参数,该参数为相应的 Node
提供类名:
module::Module = .... ;
或者,
module(Module) = ... ;
第 3 步是不可避免的,因为必须在“某处”指定翻译。 Grako 的方式允许 str
模板与 CodeGenerator
完成的分派(dispatch)内联指定,这是我首选的翻译方式。但是当我只需要从模型中提取信息时,例如生成符号表或计算指标时,我会使用 grako.model.DepthFirstNodeWalker
。
第 3 步无法自动化,因为将源语言的语义映射到目标语言的语义需要脑力,即使源语言和目标语言相同也是如此。
还可以通过遍历 parse()
或 grako.model.Node.asjson()
生成的类似 JSON 的 Python 结构(AST),正如您所建议的,但是处理代码将充满 if-then-elseif
以区分一个字典与另一个字典,或一个列表与另一个列表。对于模型,层次结构中的每个字典都有一个 Python 类作为类型。
最后,Grako 没有强加一种方法来创建已解析内容的模型,也没有强加一种将其转换为其他内容的方法。如果使用元素命名,Grako 的基本形式仅提供具体语法树 (CST) 或抽象语法树 (AST)明智地。其他一切都由特定的语义类产生,可以是任何人想要的。
关于python - Grako "code"代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35565052/
看标题。对于我正在编写的一个小工具,我想引入一种简单的 bool 过滤器语言,并决定“正确地”这样做并使用解析器生成器。在与 grako 玩了一会儿之后,我发现我喜欢它并且相当快地完成了过滤器语言(这
我的同事 PaulS 问了我以下问题: 我正在为现有语言(SystemVerilog - IEEE 标准)编写一个解析器,并且该规范中有一条结构与此类似的规则: cover_point =
我正在重做我最初在 Perl 上构建的迷你语言(请参阅 Chessa# on github ),但在应用语义时遇到了很多问题。 Here is the grammar : (* integers *)
我正在尝试通过 Grako 生成的语法来分析一些文档,该语法应该解析简单的句子以进行进一步分析,但在使用一些特殊标记时面临一些困难。 (Grako 风格)EBNF 看起来像: abbr::str =
我试图了解如何重新创建由 grako 生成的解析器解析的文档. 在深入研究 grako 源代码之后,我相信我终于理解了如何从 AST 返回到生成的文档。有人可以检查我的以下理解是否正确,让我知道是否有
在 search_query.ebnf 中,我对 grako 3.14.0 有以下语法定义: @@grammar :: SearchQuery start = search_query $; sear
我是一名优秀的程序员,十分优秀!