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 和无穷大, 因此 *<element> 允许任意次数, 包括零次; 1*<element> 要求至少一次; 3*3<element> 恰好允许 3 次; 1*2<element> 允许一次或两次.
3.7. 指定重复: nRule (Specific Repetition)
如下形式的规则:
<n>element
等价于:
<n>*<n>element
也就是说, <element> 恰好出现 <n> 次. 因此, 2DIGIT 是两位数字, 3ALPHA 是三个字母字符组成的字符串.
3.8. 可选序列: [RULE] (Optional Sequence)
方括号包含一个可选元素序列:
[foo bar]
等价于:
*1(foo bar)
3.9. 注释: ; Comment (Comment)
分号开始一个持续到行尾的注释. 这是在规范旁边包含有用注释的简单方式.
3.10. 运算符优先级 (Operator Precedence)
上述各种机制具有以下优先级, 从顶部最高 (绑定最紧) 到底部最低 (最松):
- 规则名称,prose-val,终结值
- 注释
- 值范围
- 重复
- 分组,可选项
- 串接
- 选择
将选择运算符与串接自由混用可能造成混淆. 推荐使用分组运算符来显式表示串接分组.