我正在尝试想出一个PEG语法,它可以根据RFC 2396的以下BNF值解析主机名
hostname = *( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanumdomainlabel和toplabel没有问题。
然而,hostname的规则似乎不能用聚乙二醇表达。
以下是我这么认为的原因:
如果我们采用BNF编写的语法,那么整个输入都是由*(domainlabel ".")消耗的,它不知道什么时候停止,因为toplabel [ "." ]与它是无法区分的。
简化的自包含插图:
h = (d '.')* t '.'?
d = [dt]
t = [t]这将解析t、d.d.t并在d.d.d上失败,这是完全预期的,但它无法解析t.和d.d.t.,这两种情况都是有效的。
如果我们添加一个先行,那么它将消耗t.和d.d.t.,但在d.t.t.上失败。
h = (!(t '.'?)d '.')* t '.'?
d = [dt]
t = [t]所以我没有想法了,有没有办法用PEG来表达这个BNF呢?
发布于 2017-02-08 13:39:01
如果您只需要检查有效性,您可以这样做:
/* Unchanged */
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
/* Diff with above */
nontoplabel = digit | digit *( alphanum | "-" ) alphanum
/* Rephrase */
hostname = 1*( *( nontoplabel "." ) toplabel) [ "." ]因为nontoplabel和toplabel可以通过它们的第一个字符来区分,所以在最后一个表达式中不可能有歧义。
该转换是许多可能的正则表达式标识之一:
(a | b)* a ==> (b* a)+您始终可以将a|b中的b替换为b-a (使用-作为设置差运算符)。
https://stackoverflow.com/questions/42104654
复制相似问题