【问题标题】:Parsing of optionals with PEG (Grako) falling short?使用 PEG (Grako) 解析选项不足?
【发布时间】:2014-07-06 20:47:15
【问题描述】:

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

【问题讨论】:

  • 我自己的看法是,是的,必须调整语法以强制 PEG 解析器首先选择最长的选项。

标签: parsing grammar ebnf peg grako


【解决方案1】:

上面写着here,在 PEG 中,选择运算符是有序的,以通过使用第一个匹配项来避免 CFG 的歧义。

在你的第一个例子中

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2012-08-27
    相关资源
    最近更新 更多