在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带来歧义吗?
答案 0 :(得分:1)
语法规则精确地表达了您想要的表单序列,无论您选择何种解析引擎(例如,PEG,LALR,LL(k),......)。
表达你想要使用BNF规则的所有可能序列的唯一方法是你提出的丑陋规则。
标准解决方案是简单定义:
rule <- (A | B | C)*
(或解析器生成器为列表接受的任何语法)并在语义上计算只提供3个表单并且它们是唯一的。
构建解析器生成器的人通常会添加特殊的“扩展BNF”符号来让它们描述特殊情况;您举了一个示例,使用 {3} 作为特殊语法,暗示您只需要“3 of”假设解析器生成器接受此表示法并执行相应的强制执行。可以想象使用扩展符号 {unique} 来描述您的情况。我从未见过实现这个想法的解析器生成器。