我的同事PaulS向我询问了以下内容:
我正在为一种现有语言(SystemVerilog-IEEE标准)编写一个解析器,并且该规范中包含一个规则,该规则在结构上与此类似:
cover_point
=
[[data_type] identifier ':' ] 'coverpoint' identifier ';'
;
data_type
=
'int' | 'float' | identifier
;
identifier
=
?/\w+/?
;
Run Code Online (Sandbox Code Playgroud)
问题在于解析以下合法字符串时:
anIdentifier: coverpoint another_identifier;
Run Code Online (Sandbox Code Playgroud)
anIdentifier匹配data_type成功(通过其标识符选项),这表示Grako正在寻找另一个标识符,然后失败。然后,它不会尝试在没有data_type部分的情况下进行解析。
我可以如下重写规则,
cover_point_rewrite
=
[data_type identifier ':' | identifier ':' ] 'coverpoint' identifier ';'
;
Run Code Online (Sandbox Code Playgroud)
但我想知道是否:
这是一个一般性的PEG问题,还是一个工具(Grako)?
我试图理解如何重新创建由grako生成的解析器解析的文档.
在深入了解grako源代码后,我相信我终于明白了如何从AST返回到生成的文档.有人可以检查我的以下理解是否正确,如果有更直接的方法,请告诉我?
grako.model.Node语法中每个规则的单独类(子类).每个类必须至少有一个构造函数,其中包含相应规则中每个命名元素的参数,并将其值存储在类属性中.grako.codegen.ModelRenderer定义了"代码"生成模板,用于(或多或少)一个语法中的每个规则.grako.codegen.CodeGenerator().render(...)来创建输出.这可能是对的吗?这看起来根本不直观.