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 组件区分大小写.