我的同事 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 ';'
;
但我想知道是否:
- 这是故意的
- 如果有更好的语法?
这是一个 PEG-in-general 问题,还是一个工具(Grako)?