簡體   English   中英

用PEG(Grako)解析期權的做法不盡如人意?

[英]Parsing of optionals with PEG (Grako) falling short?

我的同事保羅斯問我以下事項:


我正在為現有語言(SystemVerilog - IEEE標准)編寫解析器,並且規范中有一條規則,其結構與此類似:

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

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

identifier 
    = 
    ?/\w+/? 
    ;

問題是在解析以下合法字符串時:

anIdentifier: coverpoint another_identifier;

anIdentifierdata_type (通過其標識符選項)成功匹配,這意味着Grako正在尋找其后的另一個標識符,然后失敗。 然后,它不會嘗試在沒有data_type部分的情況下進行解析。

我可以重寫這條規則如下,

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

但我想知道:

  1. 這是故意的
  2. 如果有更好的語法?

這是一般的PEG問題,還是工具(Grako)?

這里說,在PEG中,選擇運算符被命令通過使用第一個匹配來避免CFG模糊。

在你的第一個例子中

[data_type]
成功解析id,因此它在找到時失敗:而不是另一個標識符。 這可能是因為[data_type]行為類似於(data_type | ε)所以它總是用第一個id解析data_type

[data_type identifier ':' | identifier ':' ]
當沒有第二個id時,第一個選擇失敗,因此解析器回溯並嘗試第二個選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM