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

Apa*_*ala 5 grammar parsing ebnf 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)?

101*_*010 2

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

\n\n

在你的第一个例子中

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

\n\n

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

\n