ABNF 的 Unicode 版本?

fge*_*fge 5 unicode grammar abnf

我想写的,其内容可以包含字符的文件格式,语法非US-ASCII的。由于我习惯了ABNF,所以我尝试使用它......

但是,RFC 52347405中没有一个对不使用 US 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.
Run Code Online (Sandbox Code Playgroud)

这并没有真正澄清问题。

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

Bjö*_*ann 6

请参阅RFC 5234 的 2.3 节,其中表示:

规则解析为一串最终值,有时称为字符。在 ABNF 中,字符仅仅是一个非负整数。在某些上下文中,将指定值到字符集(例如 ASCII)的特定映射(编码)。

Unicode 只是非负整数 U+0000 到 U+10FFFF 减去代理范围 D800-DFFF 的集合,并且有各种相应使用 ABNF 的 RFC。RFC 3987就是一个例子。


Joe*_*oey 1

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

\n

例如,PowerShell 语法有这样的行:

\n
\n

双引号字符:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 "( U+0022)
\n\xc2\xa0\xc2\xa0\xc2 \xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0左双引号 ( U+201C)
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\ xc2\xa0右双引号 ( U+201D)
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0双低 9 引号 (U+201E )

\n
\n

或者在Java规范中:

\n
\n

UnicodeInputCharacter:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 UnicodeEscape
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\ xa0\xc2\xa0\xc2\xa0\xc2\xa0 RawInputCharacter

\n

UnicodeEscape:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 \\ UnicodeMarker HexDigit HexDigit HexDigit HexDigit

\n

Unicode 标记:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 u
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0\xc2\xa0 UnicodeMarker u

\n

原始输入字符:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0任何 Unicode 字符

\n

HexDigit:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 之一0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

\n

\\u和十六进制数字都是 ASCII 字符。

\n
\n

请注意,周围的文本解释了 \xe2\x80\x93 的意图,这总是比仅仅向某人倾倒一堆语法要好。

\n

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

\n