【发布时间】: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 ';'
;
但我想知道:
- 这是故意的,
- 是否有更好的语法?
这是一个 PEG-in-general 问题,还是工具 (Grako) 问题?
【问题讨论】:
-
我自己的看法是,是的,必须调整语法以强制 PEG 解析器首先选择最长的选项。
标签: parsing grammar ebnf peg grako