跳到主要内容

3. 操作符

3.1. 连接: Rule1 Rule2​

一条规则可以通过列出一系列规则名来定义一个简单的、有序的值字符串 (即相邻字符的连接). 例如:

      foo         =  %x61           ; a

bar = %x62 ; b

mumble = foo bar foo

于是规则 匹配小写字符串 "aba".

线性空白 (Linear white space): 连接是 ABNF 解析模型的核心. 一个由相邻字符 (值) 组成的字符串按照 ABNF 中定义的规则来解析. 对于互联网规范, 历来有一种做法是允许线性空白 (空格和水平制表符) 自由、隐式地穿插在主要构造 (例如分隔特殊字符或原子字符串) 周围.

注意:

本 ABNF 规范不提供线性空白的隐式规定.

任何希望允许在分隔符或字符串片段周围出现线性空白的文法, 都必须显式规定它. 在 "核心 (core)" 规则中提供这类空白通常是有用的, 随后可以在更高层规则中以各种方式使用这些核心规则. "核心" 规则可以构成一个词法分析器, 或者只是主规则集的一部分.

3.2. 可选项: Rule1 / Rule2​

由正斜杠 ("/") 分隔的元素是可选项 (alternatives). 因此,

  foo / bar

将接受 或 .

注意:

包含字母字符的带引号字符串是一种用于规定可选字符的特殊形式, 它被解释为一个非终结符, 表示由其中所含字符按指定顺序、但大小写任意混合所构成的组合字符串的集合.

3.3. 增量可选项: Rule1 =/ Rule2​

有时把可选项列表分段规定会很方便. 也就是说, 初始规则可以匹配一个或多个可选项, 而后面的规则定义再向该可选项集合中添加内容. 这对于由同一父规则集派生出来的、本来相互独立的规范特别有用, 例如在参数列表中常见的情形. ABNF 通过以下构造允许这种增量定义:

      oldrule     =/ additional-alternatives

于是如下规则集

      ruleset     =  alt1 / alt2

ruleset =/ alt3

ruleset =/ alt4 / alt5

与规定如下内容相同:

      ruleset     =  alt1 / alt2 / alt3 / alt4 / alt5

3.4. 值域可选项: %c##-##​

可以用短横线 ("-") 来紧凑地规定一段可选数值的范围, 以表示可选值的范围. 因此:

      DIGIT       =  %x30-39

等价于:

      DIGIT       =  "0" / "1" / "2" / "3" / "4" / "5" / "6" /
                 "7" / "8" / "9"

连接数值 (concatenated numeric value) 和数值范围不能规定在同一个字符串中. 一个数值可以使用点号记法表示连接, 或者使用短横线记法表示一个值域. 因此, 要规定行结束序列之间的一个可打印字符, 可以这样规定:

      char-line = %x0D.0A %x20-7E %x0D.0A

3.5. 序列组: (Rule1 Rule2)​

括在圆括号中的元素被视为单个元素, 其内容严格有序. 因此,

  elem (foo / bar) blat

匹配 (elem foo blat) 或 (elem bar blat), 而

  elem foo / bar blat

匹配 (elem foo) 或 (bar blat).

注意:

当可选项由多个规则名或字面量组成时, 强烈建议使用分组记法, 而不要依赖对 "裸" 可选项的正确解读.

因此, 建议使用以下形式:

 (elem foo) / (bar blat)

这样可以避免被随意阅读的读者误解.

序列组记法也用于自由文本中, 以把元素序列与行文区分开.

3.6. 可变重复: *Rule​

位于元素之前的操作符 "*" 表示重复. 完整形式为:

  <a>*<b>element

其中 和 是可选的十进制值, 表示该元素至少出现 次、至多出现 次.

默认值为 0 和无穷大, 因此 允许任意次数 (包括零次); 1 要求至少一次; 33 允许恰好 3 次; 12 允许一次或两次.

3.7. 特定重复: nRule​

形式如下的规则:

  <n>element

等价于

  <n>*<n>element

也就是说, 恰好出现 次. 因此, 2DIGIT 是一个 2 位数, 3ALPHA 是一个由三个字母字符组成的字符串.

3.8. 可选序列: [RULE]​

方括号括起一个可选的元素序列:

  [foo bar]

等价于

  *1(foo bar).

3.9. 注释: ; Comment​

分号开始一段持续到行尾的注释. 这是把有用的说明与规范并列包含进来的一种简单方式.

3.10. 操作符优先级​

上述各种机制的优先级如下, 从最高 (结合最紧) 到最低 (最松):

Rule name, prose-val, Terminal value

Comment

Value range

Repetition

Grouping, Optional

Concatenation

Alternative

随意混用可选项操作符与连接会造成混淆.

再次建议使用分组操作符来明确连接的组合范围.