ABNF 的 Unicode 版本?

Unicode version of ABNF?

我想为一种文件格式编写语法,其内容可以包含 其他 个字符而不是 US-ASCII 字符。由于习惯了ABNF,所以我尝试使用它...

但是,none 的 RFC 5234 and 7405 对不使用美国 ASCII 的人非常友好。

事实上,我正在寻找面向字符而非字节的 ABNF 版本(可能还有一些基本规则); RFC 5234 对此唯一要说的是第 2.4 节:

2.4.  External Encodings

   External representations of terminal value characters will vary
   according to constraints in the storage or transmission environment.
   Hence, the same ABNF-based grammar may have multiple external
   encodings, such as one for a 7-bit US-ASCII environment, another for
   a binary octet environment, and still a different one when 16-bit
   Unicode is used.  Encoding details are beyond the scope of ABNF,
   although Appendix B provides definitions for a 7-bit US-ASCII
   environment as has been common to much of the Internet.

   By separating external encoding from the syntax, it is intended that
   alternate encoding environments can be used for the same syntax.

这并没有真正说明问题。

是否有某个版本的 ABNF 是面向代码点而不是面向字节的?

如果您正在编写的 ABNF 旨在供人类阅读,那么我会说只需使用正常语法并引用代码点而不是字节。您可以查看允许在源文本中使用 Unicode 的各种语言规范,例如C#、Java、PowerShell 等。它们都有语法,并且都必须在某处定义 Unicode 字符(例如标识符)。

例如PowerShell 语法有这样的行:

double-quote-character:
       " (U+0022)
       Left double quotation mark (U+201C)
       Right double quotation mark (U+201D)
       Double low-9 quotation mark (U+201E)

或者在Java规范中:

UnicodeInputCharacter:
       UnicodeEscape
       RawInputCharacter

UnicodeEscape:
       \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit

UnicodeMarker:
       u
       UnicodeMarker u

RawInputCharacter:
       any Unicode character

HexDigit: one of
       0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

The \, u, and hexadecimal digits here are all ASCII characters.

请注意,周围有解释意图的文字——这总比向某人倾倒一堆语法要好。

如果它用于自动生成解析器,您可能最好找到一个工具,它允许您以 Unicode 和类似 ABNF 的形式指定语法并发布它。不过,应该期望编写解析器的人能够理解其中任何一种。

参考section 2.3 of RFC 5234,其中说:

Rules resolve into a string of terminal values, sometimes called characters. In ABNF, a character is merely a non-negative integer. In certain contexts, a specific mapping (encoding) of values into a character set (such as ASCII) will be specified.

Unicode 只是一组非负整数 U+0000 到 U+10FFFF 减去代理项范围 D800-DFFF 并且有各种 RFC 相应地使用 ABNF。例如 RFC 3987.