跳到主要内容

3. 运算符 (Operators)

3.1. 串接: Rule1 Rule2 (Concatenation)

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

foo    =  %x61           ; a
bar = %x62 ; b
mumble = foo bar foo

因此规则 <mumble> 匹配小写字符串 "aba".

线性空白: 串接是 ABNF 解析模型的核心. 连续字符 (值) 字符串按照 ABNF 中定义的规则进行解析. 对于互联网规范, 曾有允许线性空白 (空格和水平制表符) 在主要结构周围自由且隐式插入的历史, 例如在定界特殊字符或原子字符串周围.

3.2. 选择: Rule1 / Rule2 (Alternatives)

由正斜杠 ("/") 分隔的元素表示选择. 因此:

foo / bar

将接受 <foo><bar>.

3.3. 增量选择: Rule1 =/ Rule2 (Incremental Alternatives)

有时以片段形式指定选择列表很方便. 也就是说, 初始规则可以匹配一个或多个选择, 并在之后定义额外选择. 这对源自同一父规则集但彼此独立的规范尤其有用, 参数列表中经常出现这种情况. ABNF 通过以下结构允许这种增量定义:

oldrule =/ additional-alternatives

3.4. 值范围选择: %c##-## (Value Range Alternatives)

可以使用短横线 ("-") 紧凑指定一系列备选数值, 表示备选值范围. 因此:

DIGIT = %x30-39

等价于:

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

3.5. 序列分组: (Rule1 Rule2) (Sequence Group)

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

elem (foo / bar) blat

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

elem foo / bar blat

匹配 (elem foo)(bar blat).

3.6. 可变重复: *Rule (Variable Repetition)

元素前面的运算符 "*" 表示重复. 完整形式为:

<a>*<b>element

其中 <a><b> 是可选十进制值, 表示该元素至少出现 <a> 次,最多出现 <b> 次.

默认值为 0 和无穷大, 因此 *&lt;element> 允许任意次数, 包括零次; 1*&lt;element> 要求至少一次; 3*3&lt;element> 恰好允许 3 次; 1*2&lt;element> 允许一次或两次.

3.7. 指定重复: nRule (Specific Repetition)

如下形式的规则:

&lt;n>element

等价于:

&lt;n>*&lt;n>element

也就是说, &lt;element> 恰好出现 &lt;n> 次. 因此, 2DIGIT 是两位数字, 3ALPHA 是三个字母字符组成的字符串.

3.8. 可选序列: [RULE] (Optional Sequence)

方括号包含一个可选元素序列:

[foo bar]

等价于:

*1(foo bar)

3.9. 注释: ; Comment (Comment)

分号开始一个持续到行尾的注释. 这是在规范旁边包含有用注释的简单方式.

3.10. 运算符优先级 (Operator Precedence)

上述各种机制具有以下优先级, 从顶部最高 (绑定最紧) 到底部最低 (最松):

  1. 规则名称,prose-val,终结值
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选项
  6. 串接
  7. 选择

将选择运算符与串接自由混用可能造成混淆. 推荐使用分组运算符来显式表示串接分组.