Parsing 分析PEG(Grako)不足的选项?
我的同事PaulS问我以下问题:Parsing 分析PEG(Grako)不足的选项?,parsing,grammar,ebnf,peg,grako,Parsing,Grammar,Ebnf,Peg,Grako,我的同事PaulS问我以下问题: 我正在为一种现有语言(SystemVerilog——IEEE标准)编写一个解析器,该规范中有一条规则,在结构上与此类似: cover_point = [[data_type] identifier ':' ] 'coverpoint' identifier ';' ; data_type = 'int' | 'float' | identifier ; identifier =
我正在为一种现有语言(SystemVerilog——IEEE标准)编写一个解析器,该规范中有一条规则,在结构上与此类似:
cover_point
=
[[data_type] identifier ':' ] 'coverpoint' identifier ';'
;
data_type
=
'int' | 'float' | identifier
;
identifier
=
?/\w+/?
;
问题在于,在解析以下合法字符串时:
anIdentifier: coverpoint another_identifier;
a标识符
与数据类型
(通过其标识符选项)成功匹配,这意味着Grako在它之后寻找另一个标识符,然后失败。在没有数据类型部分的情况下,它不会尝试解析
我可以重新编写规则如下:
cover_point_rewrite
=
[data_type identifier ':' | identifier ':' ] 'coverpoint' identifier ';'
;
但我想知道:
这是一个普通问题中的PEG,还是一个工具(Grako)问题?它说,在PEG中,选择操作符被命令使用第一个匹配来避免CFGs歧义
在您的第一个示例中,当没有第二个id时,第一个选择失败,因此解析器回溯并尝试使用第二个选择。我自己的看法是,是的,必须调整语法以迫使PEG解析器首先选择可能最长的选项。 [data_type] [data_type identifier ':' | identifier ':' ]