标签: grako

PEG(Grako)的可选选项解析不足?

我的同事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)

但我想知道是否:

  1. 这是故意的,
  2. 如果有更好的语法?

这是一个一般性的PEG问题,还是一个工具(Grako)?

grammar parsing ebnf peg grako

5
推荐指数
1
解决办法
530
查看次数

Grako"代码"代

我试图理解如何重新创建由grako生成的解析器解析的文档.

在深入了解grako源代码后,我相信我终于明白了如何从AST返回到生成的文档.有人可以检查我的以下理解是否正确,如果有更直接的方法,请告诉我?

  1. 一个人创建了一个希望解析的PEG语法.Grako基于它创建了一个解析器类和一个sematics类.
  2. 一个(手动)创建一个python模块,其中包含(或多或少)一个grako.model.Node语法中每个规则的单独类(子类).每个类必须至少有一个构造函数,其中包含相应规则中每个命名元素的参数,并将其值存储在类属性中.
  3. 一个子类(手动)生成的语义类,用步骤2中创建的相应类替换每个规则的ast.
  4. 一个人(手工)创建一个python模块,这个子类grako.codegen.ModelRenderer定义了"代码"生成模板,用于(或多或少)一个语法中的每个规则.
  5. 一个提供由Node子类组成的AST和包含模板的python模块grako.codegen.CodeGenerator().render(...)来创建输出.

这可能是对的吗?这看起来根本不直观.

  • 为什么要经过第2步和第3步的重大努力,除了存储已包含在AST中的信息之外什么都不做?
  • 这种方法的优点是什么,而不是直接从AST工作?
  • 如果只想重新创建原始语法中的文档,是否有办法自动化或回避步骤2和3?
  • 给定PEG语法定义,理论上可以自动创建"代码生成器生成器",就像创建"解析器生成器"一样吗?

python code-generation grako

5
推荐指数
1
解决办法
584
查看次数

标签 统计

grako ×2

code-generation ×1

ebnf ×1

grammar ×1

parsing ×1

peg ×1

python ×1