5

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

然而,没有一个 RFC 52347405对不使用美国 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 版本?

4

2 回答 2

4

请参阅RFC 5234 的第 2.3 节,其中说:

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

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

于 2015-03-13T21:41:11.063 回答
1

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

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

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

或者在 Java 规范中:

UnicodeInputCharacter:
       UnicodeEscape
       RawInputCharacter

UnicodeEscape:
       \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit

UnicodeMarker:
       u
       UnicodeMarker u

RawInputCharacter:
       任何 Unicode 字符

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

这里的\, u, 和十六进制数字都是 ASCII 字符。

请注意,周围有解释意图的文本——这总是比把一堆语法扔给某人要好。

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

于 2015-03-11T07:27:46.403 回答