W3C:无法阅读 EBNF 的 SPARQL IRIREF 规范?

W3C: Can't read EBNF's SPARQL IRIREF specification?

(规格:https://www.w3.org/TR/sparql11-query/#rIRIREF

根据规范,IRIREF 可以这样解析:

[139]   IRIREF    ::=   '<' ([^<>"{}|^`\]-[#x00-#x20])* '>'

困扰我的是表达式的这一部分:

\]-[

如果我认为 \ 是括号字符 class 中的转义字符(在 Perl 正则表达式中就是这种情况),那么这意味着 \ 单独在 IRIREF 中不是问题,这是有效的:<http://hello\world>

那么这个范围就有这个大问题:]-[。字符 ] 的序数值是 93,[ 的序数值是 91。这意味着我们有一个无效范围:93 到 92。这在我测试的大多数正则表达式引擎中都是不允许的。

这是什么意思?

  1. 我是否应该将 - 视为括号字符 class 中的常规字符,那么这是无效的 IRIREF: <http://new-example.org>。没有意义。
  2. 我是否应该考虑范围 ]-[ 为空并且此 IRIREF 有效:<http://hello[world]>
  3. 我认为更有可能的是范围倒置了,这不是w3c规范的问题,这意味着字符[\]是无效字符.这是有道理的。

这是shorthand句法糖,EBNF准确地说,是一种超越正则表达式标准特性的句法:

这意味着 prior character class without following character class,在此特定实例中 not certain brackets and quotes, and neither control codes from 0x00 (NUL) to 0x20 (SPC), which would otherwise be included

相关参考:EBNF notation used, in particular the clause A - B. It is referred to in the first paragraph of the SPARQL grammar.

SPARQL 规范说它的语法是使用符号 defined by the XML 1.1 specification 编写的。

在该表示法中,您引用的右侧,

'<' ([^<>"{}|^`\]-[#x00-#x20])* '>'

表示

的序列
  • 一个 '<' 字符
  • 零个或多个匹配表达式 [^<>"{}|^`]-[#x00-#x20] 的字符;这是表示

    的集合差异
    • 由 [^<>"{}|^\] = any character other than '<', '>', '"', '{', '}', '|', '^', '' 或 '\' 匹配的任何字符;n.b。'\' 不是此表示法中的转义字符(它具有根本没有转义字符)
    • 除[#x00-#x20]匹配的=控制字符C1区加空格

    这种模式的写法有点奇怪;它同样可以写成 [^<>"{}|^`#x00-#x20];我不确定为什么编辑们会这样写。

  • 一个'>'字符

所以一一回答你的问题:

Should I consider the - as a regular character in the bracketed character class, then this is invalid IRIREF: http://new-example.org. It makes no sense.

没有。当 AB 是这种表示法中的表达式时, A - B 表示 A 语言中的任何字符串,它也不是 B 语言中的字符串。这里AB分别是字符-class表达式,一负一正。

你是对的,从旨在接受用尖括号括起来的 IRI 的语法规则中禁止连字符是没有意义的。

Should I consider the range ]-[ null and this IRIREF is valid: http://hello[world]

']-[' 在这里不表示范围,null 或其他; ] 结束第一个字符 class 表达式,[ 开始第二个字符。

What I think is more likely is that the range is inverted and is not a problem for w3c specifications, which means the characters [, \ and ] are invalid characters. This makes sense.

如果我对表达式的解析是正确的,'['和']'是合法的(它们不被第一个表达式排除,也不被第二个表达式排除); '\' 被第一个表达式排除。