[英]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;
anIdentifier
與data_type
(通過其標識符選項)成功匹配,這意味着Grako正在尋找其后的另一個標識符,然后失敗。 然后,它不會嘗試在沒有data_type部分的情況下進行解析。
我可以重寫這條規則如下,
cover_point_rewrite
=
[data_type identifier ':' | identifier ':' ] 'coverpoint' identifier ';'
;
但我想知道:
這是一般的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.