Parsing 分析PEG(Grako)不足的选项?

Parsing 分析PEG(Grako)不足的选项?,parsing,grammar,ebnf,peg,grako,Parsing,Grammar,Ebnf,Peg,Grako,我的同事PaulS问我以下问题: 我正在为一种现有语言(SystemVerilog——IEEE标准)编写一个解析器,该规范中有一条规则,在结构上与此类似: cover_point = [[data_type] identifier ':' ] 'coverpoint' identifier ';' ; data_type = 'int' | 'float' | identifier ; identifier =

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


我正在为一种现有语言(SystemVerilog——IEEE标准)编写一个解析器,该规范中有一条规则,在结构上与此类似:

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

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

identifier 
    = 
    ?/\w+/? 
    ;
问题在于,在解析以下合法字符串时:

anIdentifier: coverpoint another_identifier;
a标识符
数据类型
(通过其标识符选项)成功匹配,这意味着Grako在它之后寻找另一个标识符,然后失败。在没有数据类型部分的情况下,它不会尝试解析

我可以重新编写规则如下:

cover_point_rewrite  
    = 
    [data_type identifier ':' | identifier ':' ] 'coverpoint' identifier ';' 
    ;
但我想知道:

  • 这是有意和无意的
  • 如果有更好的语法

  • 这是一个普通问题中的PEG,还是一个工具(Grako)问题?

    它说,在PEG中,选择操作符被命令使用第一个匹配来避免CFGs歧义


    在您的第一个示例中,当没有第二个id时,第一个选择失败,因此解析器回溯并尝试使用第二个选择。

    我自己的看法是,是的,必须调整语法以迫使PEG解析器首先选择可能最长的选项。 [data_type] [data_type identifier ':' | identifier ':' ]