使用解析表达式语法解析无序序列

时间:2011-07-17 11:22:05

标签: parsing grammar

parsing expression grammar(PEG)内是否有(简单)方式表达“无序序列”?像

这样的规则
Rule <- A B C

要求A,B和C按顺序匹配。像

这样的规则
Rule <- (A B C) / (B C A) / (C A B) / (A C B) / (C B A) / (B A C)

允许它们以任何顺序匹配(这是我们想要的)但是它在实践中很麻烦并且不适用于序列中的更多术语。

是使用语法宽松规则的唯一解决方案,例如

Rule <- (A / B / C){3}

并在语义上检查每条规则只匹配一次?

例如,Relax NG Compact Syntax有"unordered list" operator解析XML的事实让我暗示没有明显的解决方案。

最后一个问题:你认为增加这样一个运营商会给PEG带来歧义吗?

1 个答案:

答案 0 :(得分:1)

语法规则精确地表达了您想要的表单序列,无论您选择何种解析引擎(例如,PEG,LALR,LL(k),......)。

表达你想要使用BNF规则的所有可能序列的唯一方法是你提出的丑陋规则。

标准解决方案是简单定义:

rule <- (A | B | C)* 

(或解析器生成器为列表接受的任何语法)并在语义上计算只提供3个表单并且它们是唯一的。

构建解析器生成器的人通常会添加特殊的“扩展BNF”符号来让它们描述特殊情况;您举了一个示例,使用 {3} 作为特殊语法,暗示您只需要“3 of”假设解析器生成器接受此表示法并执行相应的强制执行。可以想象使用扩展符号 {unique} 来描述您的情况。我从未见过实现这个想法的解析器生成器。