Skip to main content

2. Rule Definition (规则定义)

2.1. Rule Naming (规则命名)

规则名称只是名称本身,即由字母字符和连字符(破折号)组成的字符序列。

规则名称不区分大小写。

规则名称<rulename>, <Rulename>, <RULENAME><rUlENamE>都指同一个规则。

与原始BNF不同,尖括号("<", ">")不是必需的。但是,只要有助于识别规则名称的使用,就可以使用它们。这通常仅限于规则名称引用在散文中很难看到,或者对于非BNF读者来说难以区分的情况。

2.2. Rule Form (规则形式)

规则定义如下:

name = elements crlf

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

等号 (=) 将名称和元素定义分开。元素形成一个或多个规则名称和/或值定义的序列,以各种运算符(如备选项和重复)组合在一起,稍后将定义。

为了视觉上的便利,规则定义被左对齐。当一个规则需要多行时,续行缩进。左对齐和缩进相对于ABNF规则的第一行,不需要匹配文档的左边距。

2.3. Terminal Values (终端值)

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

终端由一个或多个数字字符指定,并使用以下形式之一显示基数解释:

b = 二进制
d = 十进制
x = 十六进制

因此:

CR  = %d13        ; 十进制的回车
CR = %x0D ; 十六进制的回车

指定文字文本字符串直接用引号引起来。

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

因此:

command = "command string"

等同于:

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

等等。

连接值

可以指定一系列连续的值,用句点(".")分隔字符:

CRLF = %d13.10    ; 回车换行序列

值范围

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

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

2.4. External Encodings (外部编码)

ABNF字符串的外部表示(即文档之外)受用于存储或传输的传输或存储环境的限制。ABNF规范本身不指定任何特定的传输编码。

注意: ABNF字符串区分大小写,文字文本字符串不区分大小写。这对于某些类型的URI规范很重要,其中方案名称不区分大小写,但路径组件区分大小写。