我的同事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一般性问题还是工具(Grako)的问题?