2. 规则定义
2.1. 规则命名
规则的名称就是名称本身, 也就是一个字符序列, 它以字母字符开头, 后跟字母、数字和连字符 (短横线) 的组合.
注意:
规则名称是大小写不敏感的.
名称
与最初的 BNF 不同, 尖括号 ("<"、">") 不是必需的. 然而, 只要尖括号的存在有助于辨认出某处使用的是规则名, 就可以在规则名周围使用它们. 这通常限于自由格式的行文中的规则名引用, 或者用于区分那些组合成一个不以空白分隔的字符串的部分规则, 如下文关于重复的讨论所示.
2.2. 规则形式
一条规则由以下序列定义:
name = elements crlf
其中
为了视觉上的便利, 规则定义采用左对齐. 当一条规则需要多行时, 续行要缩进. 左对齐和缩进是相对于 ABNF 规则的首行而言的, 不必与文档的左边界一致.
2.3. 终结值
规则归结为一个由终结值 (terminal value) 组成的字符串, 有时也称为字符 (character). 在 ABNF 中, 字符仅仅是一个非负整数. 在某些上下文中, 会规定值到字符集 (例如 ASCII) 的特定映射 (编码).
终结符由一个或多个数字字符规定, 并显式指明这些字符的进制解释. 目前已定义以下进制:
b = binary
d = decimal
x = hexadecimal
因此:
CR = %d13
CR = %x0D
分别规定了 [US-ASCII] 中回车的十进制和十六进制表示.
这样一组值的连接字符串可以用紧凑方式规定, 即使用句点 (".") 来表示该值内字符的分隔. 因此:
CRLF = %d13.10
ABNF 允许直接规定字面文本字符串, 即用双引号括起来. 因此:
command = "command string"
字面文本字符串被解释为一组连接起来可打印字符.
注意:
ABNF 字符串是大小写不敏感的, 这些字符串的字符集是 US-ASCII.
因此:
rulename = "abc"
和:
rulename = "aBc"
将匹配 "abc"、"Abc"、"aBc"、"abC"、"ABc"、"aBC"、"AbC" 和 "ABC".
要规定一条大小写敏感的规则, 就逐个规定字符.
例如:
rulename = %d97 %d98 %d99
或
rulename = %d97.98.99
将只匹配仅由小写字符组成的那一个字符串, 即 abc.
2.4. 外部编码
终结值字符的外部表示会随存储或传输环境的约束而变化. 因此, 同一个基于 ABNF 的文法可能有多种外部编码, 例如一种用于 7 位 US-ASCII 环境, 另一种用于二进制八位组环境, 使用 16 位 Unicode 时又是另一种. 编码细节超出了 ABNF 的范围, 不过附录 B 为 7 位 US-ASCII 环境提供了定义, 这在互联网的很大一部分中是常见的.
通过把外部编码与语法分离, 其意图是让同一语法可以使用不同的编码环境.