跳到主要内容

2. 规则定义

2.1. 规则命名​

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

注意:

规则名称是大小写不敏感的.

名称 、、 和 都指向同一条规则.

与最初的 BNF 不同, 尖括号 ("<"、">") 不是必需的. 然而, 只要尖括号的存在有助于辨认出某处使用的是规则名, 就可以在规则名周围使用它们. 这通常限于自由格式的行文中的规则名引用, 或者用于区分那些组合成一个不以空白分隔的字符串的部分规则, 如下文关于重复的讨论所示.

2.2. 规则形式​

一条规则由以下序列定义:

      name =  elements crlf

其中 是规则的名称, 是一个或多个规则名或终结符规范, 是行结束指示符 (回车后跟换行). 等号把名称与该规则的定义分开. elements 形成一个由一个或多个规则名和/或值定义组成的序列, 按照本文档定义的各种操作符 (例如可选项和重复) 组合起来.

为了视觉上的便利, 规则定义采用左对齐. 当一条规则需要多行时, 续行要缩进. 左对齐和缩进是相对于 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 环境提供了定义, 这在互联网的很大一部分中是常见的.

通过把外部编码与语法分离, 其意图是让同一语法可以使用不同的编码环境.