Unicode版本的ABNF?

时间:2015-03-11 07:20:46

标签: unicode grammar abnf

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

答案 0 :(得分:2)

请参阅section 2.3 of RFC 5234,其中说明:

  

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

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

答案 1 :(得分:1)

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

E.g。 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形式指定语法的工具,然后发布它。但是,编写解析器的人应该也应该理解。