首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RFC 2396中的语法(关于URI)如何在PEG中表达?

RFC 2396中的语法(关于URI)如何在PEG中表达?
EN

Stack Overflow用户
提问于 2017-02-08 12:21:30
回答 1查看 157关注 0票数 0

我正在尝试想出一个PEG语法,它可以根据RFC 2396的以下BNF值解析主机名

代码语言:javascript
运行
复制
  hostname      = *( domainlabel "." ) toplabel [ "." ]
  domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
  toplabel      = alpha | alpha *( alphanum | "-" ) alphanum

domainlabeltoplabel没有问题。

然而,hostname的规则似乎不能用聚乙二醇表达。

以下是我这么认为的原因:

如果我们采用BNF编写的语法,那么整个输入都是由*(domainlabel ".")消耗的,它不知道什么时候停止,因为toplabel [ "." ]与它是无法区分的。

简化的自包含插图:

代码语言:javascript
运行
复制
h = (d '.')* t '.'?
d = [dt]
t = [t]

这将解析td.d.t并在d.d.d上失败,这是完全预期的,但它无法解析t.d.d.t.,这两种情况都是有效的。

如果我们添加一个先行,那么它将消耗t.d.d.t.,但在d.t.t.上失败。

代码语言:javascript
运行
复制
h = (!(t '.'?)d '.')* t '.'?
d = [dt]
t = [t]

所以我没有想法了,有没有办法用PEG来表达这个BNF呢?

EN

回答 1

Stack Overflow用户

发布于 2017-02-08 13:39:01

如果您只需要检查有效性,您可以这样做:

代码语言:javascript
运行
复制
/* Unchanged */
toplabel      = alpha | alpha *( alphanum | "-" ) alphanum
/* Diff with above */
nontoplabel   = digit | digit *( alphanum | "-" ) alphanum
/* Rephrase */
hostname      = 1*( *( nontoplabel "." ) toplabel) [ "." ]

因为nontoplabeltoplabel可以通过它们的第一个字符来区分,所以在最后一个表达式中不可能有歧义。

该转换是许多可能的正则表达式标识之一:

代码语言:javascript
运行
复制
(a | b)* a ==> (b* a)+

您始终可以将a|b中的b替换为b-a (使用-作为设置差运算符)。

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

https://stackoverflow.com/questions/42104654

复制
相关文章

相似问题

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