ABNF的Unicode版本是什么?

6
我想为一个文件格式编写语法,其内容可以包含非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.

这并没有真正澄清问题。
是否有一个ABNF版本是基于代码点而不是字节的?
2个回答

6
参考RFC 5234的2.3节,其中提到:

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

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

我刚写的一个例子:unescaped-normal-char = %x00-5B / %x7C / %x7E-D7FF / %xE000-10FFFF。但别忘了对可怜的人类读者要友好,像这样加上注释: ; 任何 Unicode 码点都可以,除了 "\","{" 和 "}"。(还要检查排除的范围是否正确!) - Chris Morgan
嘿,我刚来到这里,想写一条评论纠正之前的评论,结果发现那条评论是我写的!好吧,纠正一下,评论应该写成“任何Unicode 标量值”,而不是“任何Unicode代码点”;U+D800–U+DFFF是有效的Unicode代码点,但不是有效的Unicode标量值,除非你正在处理UTF-16并通过代码点访问它(避免这样做!),否则你关心的是标量值。 - Chris Morgan

1
如果你写的ABNF是供人阅读的,那么我建议使用普通语法,并引用代码点而不是字节。你可以查看各种允许在源文本中使用Unicode的语言规范,例如C#,Java,PowerShell等。它们都有一个语法,并且都必须在某个地方定义Unicode字符(例如标识符)。例如,PowerShell语法中有如下行: "double-quote-character:" "(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格式的语法,并发布它。编写解析器的人应该能够理解其中任何一种形式。

嗯,我确实编写解析器(我是grappa的维护者);但是当已经有一个好的语法定义时,我宁愿不发明另一种语法语言,除非它对i18n不友好! - fge
在这种情况下,我建议只使用普通的ABNF,并明确指定终端字符数据时使用它们的Unicode代码点而不是ASCII值。但是,这使得为整个Unicode字符类别指定终端变得...繁琐。这可能不是官方的方式,但人们应该能够理解它。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接