5

我的同事 PaulS 问了我以下问题:


我正在为现有语言(SystemVerilog - IEEE 标准)编写解析器,并且规范中有一个规则,其结构与此类似:

cover_point 
    = 
    [[data_type] identifier ':' ] 'coverpoint' identifier ';' 
    ;

data_type 
    = 
    'int' | 'float' | identifier 
    ;

identifier 
    = 
    ?/\w+/? 
    ;

问题是在解析以下合法字符串时:

anIdentifier: coverpoint another_identifier;

anIdentifier成功匹配data_type(通过其标识符选项),这意味着 Grako 正在寻找另一个标识符,然后失败。然后它不会尝试在没有 data_type 部分的情况下进行解析。

我可以重写规则如下,

cover_point_rewrite  
    = 
    [data_type identifier ':' | identifier ':' ] 'coverpoint' identifier ';' 
    ;

但我想知道是否:

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

这是一个 PEG-in-general 问题,还是一个工具(Grako)?

4

1 回答 1

2

在这里说,在 PEG 中,选择运算符被命令通过使用第一个匹配来避免 CFG 的歧义。

在你的第一个例子中

[数据类型]
成功解析 id,所以当它找到:而不是另一个标识符时它会失败。这可能是因为[data_type]行为(data_type | ε)如此,它总是会data_type使用第一个 id 进行解析。

[数据类型标识符“:”| 标识符“:”]
当没有第二个 id 时,第一个选择失败,因此解析器回溯并尝试第二个选择。

于 2014-09-19T18:29:38.163 回答