首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用解析表达式文法解析无序序列

用解析表达式文法解析无序序列
EN

Stack Overflow用户
提问于 2011-07-17 19:22:05
回答 1查看 452关注 0票数 5

在聚乙二醇( parsing expression grammar )中,有没有一种(简单的)方法来表达“无序序列”?这样的规则

代码语言:javascript
运行
复制
Rule <- A B C

要求A、B和C按顺序匹配。这样的规则

代码语言:javascript
运行
复制
Rule <- (A B C) / (B C A) / (C A B) / (A C B) / (C B A) / (B A C)

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

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

代码语言:javascript
运行
复制
Rule <- (A / B / C){3}

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

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

最后一个问题:你认为添加这样的操作符会给PEG带来歧义吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-18 01:59:17

语法规则精确地表达了所需的表单序列,而与解析引擎无关(例如,PEG、LALR、LL(k)等)你所选择的。

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

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

代码语言:javascript
运行
复制
rule <- (A | B | C)* 

(或者您的解析器生成器为列表接受的任何语法),并且从语义上计算只提供了3种形式,并且它们是唯一的。

构建解析器生成器的人通常会添加特殊的“扩展BNF”符号来描述特殊情况;您给出了一个使用{3}作为特殊语法的示例,这意味着在假设解析器生成器接受此符号并执行适当的强制执行的情况下,您只需要"3 of“。你可以想象一个扩展符号{唯一},让你描述你的情况。我从来没有见过实现这个想法的解析器生成器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6723502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档