3. 操作符
3.1. 连接: Rule1 Rule2
一条规则可以通过列出一系列规则名来定义一个简单的、有序的值字符串 (即相邻字符的连接). 例如:
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
于是规则
线性空白 (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 和无穷大, 因此
3.7. 特定重复: nRule
形式如下的规则:
<n>element
等价于
<n>*<n>element
也就是说,
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
随意混用可选项操作符与连接会造成混淆.
再次建议使用分组操作符来明确连接的组合范围.