ABNF

ABNF 是一种用于定义互联网规范的语法,它基于 BNF (Backus-Naur Form,巴克斯-瑙尔范式),被称作扩充巴克斯-瑙尔范式。RFC5234 中定义了 ABNF 及它的规则。

ABNF的规则定义

ABNF规则命名

ABNF 的名称就是一系列字符序列,它以字符开始,后接字符,数字或连字符(破折号)。另外,ABNF 名称大小写不敏感,<rulename>,<Rulename>,<RULENAME> 和 <rUleNamE> 指向同一个规则。

ABNF 规则的形式为:

rulename = elements crlf  

<rulename> 是规则名称,<elements> 是一个或多个规则列表或终端值,<crlf> 是行结束符。

ABNF的操作符

连接

rule1 rule2
使用空格来连接规则定义中的不同元素,要把空格识别为规则中的分隔符则必须明确指定。

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

此规则表示小写字符串”aba”。

选择

rule1/rule2
使用反斜杠 ‘/’ 分隔的多个元素来表示多选一规则。

foo / bar

表示可以匹配规则 <foo> 或 <bar>。

增量选择

rule1=/rule2
通过在规则名称与定义之间使用 =/ 来表示向规则添加一个选择选项。

ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5

就表示:

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

取值范围

%c##-##
可以使用破折号 - 来连接可选数值的范围。

DIGIT = %x30-39

表示:

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

序列组

(rule1 rule2)
圆括号中的规则表示一个组合。

elem (foo / bar) blat

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

elem foo / bar blat

匹配 (elem foo)(bar blat)

值重复

\<a>*\<b>element
使用 * 来表示值重复,<a> 和 <b> 可选,<a> 表示最小重复次数,默认为 0,<b> 表示最大重复次数,默认为无穷次。
*\<element> 允许重复任意次,包括0;1*\<element> 表示最少一次;3*3\<element> 只允许3次;1*2\<element> 允许一到两次。

特定重复

\<n>element
等同于:
\<n>*\<n>element
表示 <element> 重复 n 次。

可选序列

[rule]
使用中括号括起来表示一组可选序列。
如:
[foo bar] 等同于 *1(foo bar)

注释

; 开始表示注释的开始,一直到该行结束。如 ; comments

操作符优先级

上述各种操作符具有以下优先级,从顶部的最高(绑定最紧)到底部的最低(绑定最松):
规则名称、终端值
注释
取值范围
重复
分组,可选
连接
替代选项

ABNF 核心规则

ABNF 定义了一些常用的基本规则,如下:

规则 定义 含义
ALPHA %x41-5A / %x61-7A A-Z / a-z
BIT “0” / “1” “0”,”1”
CHAR %x01-7F 任何 7-位 US-ASCII 字符,不包括 NUL
CR %x0D 回车
CRLF CR LF 互联网标准换行
CTL %x00-1F / %x7F 控制字符
DIGIT %x30-39 0-9
DQUOTE %x22 ” (双引号)
HEXDIG DIGIT / “A” / “B” / “C” / “D” / “E” / “F” 十六进制数字 (0-9 A-F a-f)
HTAB %x09 水平制表符
LF %x0A 换行
OCTET %x00-FF 8 位数据
SP %x20 空格
VCHAR %x21-7E 可见(可打印)字符
WSP SP / HTAB 空白符(空格或水平制表符)
LWSP *(WSP / CRLF WSP) 多个空白符或换行加空白符

参考
RFC5234
语法规范:BNF与ABNF 巴斯克范式