在聚乙二醇( parsing expression grammar )中,有没有一种(简单的)方法来表达“无序序列”?这样的规则
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带来歧义吗?
发布于 2011-07-18 01:59:17
语法规则精确地表达了所需的表单序列,而与解析引擎无关(例如,PEG、LALR、LL(k)等)你所选择的。
表达你想要使用BNF规则的东西的所有可能序列的唯一方法是你提出的丑陋的大规则。
标准的解决方案是简单地定义:
rule <- (A | B | C)* (或者您的解析器生成器为列表接受的任何语法),并且从语义上计算只提供了3种形式,并且它们是唯一的。
构建解析器生成器的人通常会添加特殊的“扩展BNF”符号来描述特殊情况;您给出了一个使用{3}作为特殊语法的示例,这意味着在假设解析器生成器接受此符号并执行适当的强制执行的情况下,您只需要"3 of“。你可以想象一个扩展符号{唯一},让你描述你的情况。我从来没有见过实现这个想法的解析器生成器。
https://stackoverflow.com/questions/6723502
复制相似问题