跳到主要内容

2. 规则定义 (Rule Definition)

2.1. 规则命名 (Rule Naming)

规则的名称就是名称本身, 即一个字符序列: 以字母字符开头, 后跟字母,数字和连字符 (短横线) 的组合.

规则名称不区分大小写.

名称 <rulename>,<Rulename>,<RULENAME><rUlENamE> 都指同一条规则.

与原始 BNF 不同, 这里不要求使用尖括号 ("<", ">"). 但是, 当尖括号有助于辨别规则名称的使用时, 可以将其用于规则名称周围. 这通常限于自由格式说明文字中的规则名称引用, 或用于区分会组合成不以空白分隔的字符串的部分规则, 如下文关于重复的讨论所示.

2.2. 规则形式 (Rule Form)

规则由以下序列定义:

name = elements crlf

其中 <name> 是规则名称, <elements> 是一个或多个规则名称或终结符规范, <crlf> 是行尾指示符 (回车后跟换行).

等号 (=) 将名称与规则定义分隔开. elements 构成一个由一个或多个规则名称和/或值定义组成的序列, 并按照本文档定义的各种运算符 (例如选择和重复) 组合.

为便于阅读, 规则定义采用左对齐. 当规则需要多行时, 后续行缩进. 左对齐和缩进是相对于 ABNF 规则的首行而言的, 不需要与文档左边距匹配.

2.3. 终结值 (Terminal Values)

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

终结符由一个或多个数字字符指定, 并显式指明这些字符的进制解释:

b = binary
d = decimal
x = hexadecimal

因此:

CR  = %d13        ; carriage return in decimal
CR = %x0D ; carriage return in hexadecimal

字面文本字符串直接用引号括起指定.

这些字符串不区分大小写, 字符集为 US-ASCII.

因此:

command = "command string"

等价于:

command = "Command" / "COMMAND" / "command"

依此类推.

串接值 (Concatenated Values)

此类值的串接字符串可以紧凑指定, 使用句点 (".") 表示该值内字符之间的分隔:

CRLF = %d13.10    ; carriage return line feed sequence

值范围 (Value Ranges)

可以使用连字符 ("-") 指定值范围:

DIGIT = %x30-39   ; 0-9
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z

2.4. 外部编码 (External Encodings)

终结值字符的外部表示会根据存储或传输环境中的约束而变化. 因此, 同一基于 ABNF 的语法可能具有多种外部编码, 例如一种用于 7 bit US-ASCII 环境, 另一种用于二进制八位字节环境, 还有一种用于 16 bit Unicode. 编码细节超出 ABNF 范围, 尽管 Appendix B 为互联网中常见的 7 bit US-ASCII 环境提供了定义.

通过将外部编码与语法分离, 目的是让同一语法可以用于不同编码环境.

注意: ABNF 字符串区分大小写, 而字面文本字符串不区分大小写. 对于某些类型的 URI 规范, 这一点很重要, 因为 scheme 名称不区分大小写, 但 path 组件区分大小写.