1 引言(introduction)
ABNF(Augmented Backus-Naur Form) 是一种基于BNF(Backus-Naur Form)的元语言(metalanguate),在RFC2234中对其进行了语法(syntax)定义,并且被RFC文档广泛使用,用来描述互联网协议。
ABNF和标准的BNF之间的区别主要是:引入了命名规则(naming rules)、repetition、alternatives、order-independence和value ranges。
2 规则定义(rule definition)
2.1 规则名称 -- Rule Name.
规则名称的命名规则由字母、数字和连字符(hyphens)组成,必须以字母开头。规则名称不区分大小写(case-insensitive),因此,规则名<rulename>、<Rulename>、<RULENAME>和<rUlENAMe>都指向同一个规则。
不同于最初的BNF,尖括号(“<
”,“>
”)包围规则名并不是必需的。但是,最好是用尖括号与规则名称一起出现,因为这样会更加容易识别规则名称。通常情况下,尖括号应用于规则名,或者与字符串绑定(字符串内不能有空格)用于识别部分规则,例如后续段落即将介绍的repetition (5.6 variable repetition)。
2.2 规则格式 -- Rule Form.
规则的定义如下:
rulename = elements crlf
等号的左边rulename表示规则名,等号的右边表示规则的定义,规则的定义一般由规则序列(elements)、行结束标志(<crlf>)组成。
2.3 终结符值--Terminal Values.
终结符值有时也叫字符,一串终结符值的组合即为规则。终结符由一个或者多个数字字符说明,这些数字字符代表的含义由其它字符给出,可以参见ASCII码表。数字字符表示方式可以为十进制%d、二进制%b、十六进制%x.
因此,
'a' = %d97
'a' = %x61
'a' = %b1100001
分别表示的US-ASCII表内a的十进制、十六进制和二进制表示。
'b' = %d98
'b' = %x62
'b' = %b1100010
用'.'可以实现连续串值的压缩表示。
例如:
ab = %d97.98
行结束标志与终结符值并不是一回事,可以用终结符值(CL CR)表示行结束标志。
在ABNF中,可以用双引号表示文字串,例如,"print abc"表示文字串print abc,忽略字符串内的magic字符,例如,%d在双引号内仅代表串"%d"。
文字串不区分大小写,所以,
rulename = "abc"
和"aBc","aBc","ABc"等相匹配。
加入只想匹配abc,应该写成如下的格式:
rulename = %d97 %d98 %d99 或者
rulename = %d97.98.99
2.4 外部编码 -- External Encodings
本文主要讨论的是基于7位的us-ascii编码格式。3 操作符(operators)
3.1 连接 --concatenaation
Rule = Rule1 Rule2例如,为了匹配字符串"aba",首先应该定义以下两种规则:
fu = %x61; a
bar = %x62; b
然后定义匹配"aba"的规则:
mumble = fu bar fu
3.2 选择 -- Alternative
Rule = Rule1 / Rule2由斜杠("/")分割的元素是可选的。
3.3 扩充选择 -- Incremental alternatives
Rule =/ Rule1将Rule1附加到Rule.
eg.
rule = alt1 / alt2
rule =/ alt3
rule =/ alt4 / alt5
-->rule = alt1 / alt2 / alt3 / alt4 / alt5
3.4 值域选择 -- Value Range Alternatives
可以使用连字符("-")表明可选值的域,表达更加简洁。eg.
DIGIT = %x30-39
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
note:字符"0" 的ascii码为%x30
3.5 序列组 -- Sequence Group
在括号内出现的内容必须作为单一的element,并且内容出现的顺序也是严格要求的。eg.
elem (foo / bar) blat
匹配的内容为(elem foo blat)或者(elem bar blat).
建议尽可能的使用括号,避免歧义.
eg.
elem foo / elem bar
匹配(elem foo)或者(elem bar)
建议写成:(elem foo) / (elem bar)
3.6 不定循环 -- variable Repetition
在element前面出现的操作符"*"表示循环。完整的表示形式为:<a>*<b>element
<a> 和 <b> 为可选的十进制数,表示元素至少出现<a>次,至多<b>次。
<a>的默认值为0。<b>的默认值为无穷大。
*element 0-->无穷大
1*element 1-->无穷大
3*3element 3次
1*2element 1-->2次
3.7 指定出现的次数 -- Specific Repetition
规则的表现形式:<n>element
等价于
<n>*<n>element
因此,2DIGIT表示2位数的数字,3ALPHA表示三个字母的字符串。
DIGIT和ALPHA代表的含义见附录.
3.8 可选序列 -- Optional Sequence
用方括号表征可选序列:[foo bar]
等价于
*1(foo bar)
0*1(foo bar)
3.9 注释 -- comment
从分号";"开始到一行的结束都代表注释.3.10 操作符的优先级 -- operator Precedence
Strings,Names formationcomment
Value range
Repetition
Grouping,Optional
Concatenation
Alternative
需要注意的事项:
随意混用选择操作符和连接操作符,会引起混淆。
推荐使用分组操作符明确区分具有相互关系的组。
4. 用ABNF定义ABNF(ABNF DEFINITION OF ABNF)
下述语法中使用的规则详见附录A。
rulelist = 1*( rule / (*c-wsp c-nl) )
rule = rulename defined-as elements c-nl
; continues if next line starts
; with white space
rulename = ALPHA *(ALPHA / DIGIT / "-")
defined-as = *c-wsp ("=" / "=/") *c-wsp
; basic rules definition and
; incremental alternatives
elements = alternation *c-wsp
c-wsp = WSP / (c-nl WSP)
c-nl = comment / CRLF
; comment or newline
comment = ";" *(WSP / VCHAR) CRLF
alternation = concatenation
*(*c-wsp "/" *c-wsp concatenation)
concatenation = repetition *(1*c-wsp repetition)
repetition = [repeat] element
repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)
element = rulename / group / option /
char-val / num-val / prose-val
group = "(" *c-wsp alternation *c-wsp ")"
option = "[" *c-wsp alternation *c-wsp "]"
char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
; quoted string of SP and VCHAR
without DQUOTE
num-val = "%" (bin-val / dec-val / hex-val)
bin-val = "b" 1*BIT
[ 1*("." 1*BIT) / ("-" 1*BIT) ]
; series of concatenated bit values
; or single ONEOF range
dec-val = "d" 1*DIGIT
[ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]
hex-val = "x" 1*HEXDIG
[ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]
prose-val = "<" *(%x20-3D / %x3F-7E) ">"
; bracketed string of SP and VCHAR
without angles
; prose description, to be used as
last resort
5 安全相关(security consideration)
本文档与安全无关。
6 附录A-核心 (appendix A - core)
6.1 核心规则 -- core rules
本附录提供了方便的具体语法的核心。
定义可作为一套核心规则。
BIT = "0" / "1"
CHAR = %x01-7F ;us-ascii中的任意一个字符.除了NUL之外.
CR = %x0D ;carriage return
CRLF = CR LF ;以太网标准的换行
CTL = %x00-1F / %7F ;控制字符
DIGIT = %x30-39 ;0-9
DQUOTE = %0x22 ;双引号
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
HTAB = %x09 ;tab键
LF = %x0A ; 换行 linefeed
LWSP = *(WSP / CRLF WSP) ;linear white spate(past newline)
OCTET = %x00-FF ;8 bits of data
SP = %x20 ;空格
WSP = SP / HTAB
6.2 常用编码 -- common encoding
另外,数据被表示为“网络虚拟ASCII”,即在8bit的字段中,使用7位bitUS-ASCII,最高位为0。字符串在网络字节序中表现为:高字节在左边(big endian),并且最先通过网络发送。(可参见网络字节序相关文档)。
7. 参考文献(reference)
[US-ASCII] Coded Character Set--7-Bit American Standard Code for
Information Interchange, ANSI X3.4-1986.
[RFC733] Crocker, D., Vittal, J., Pogran, K., and D. Henderson,
"Standard for the Format of ARPA Network Text Message," RFC 733,
November 1977.
[RFC822] Crocker, D., "Standard for the Format of ARPA Internet Text
Messages", STD 11, RFC 822, August 1982.
8 联系(contact)
David H. Crocker Paul Overell
Internet Mail Consortium Demon Internet Ltd
675 Spruce Dr. Dorking Business Park
Sunnyvale, CA 94086 USA Dorking
Surrey, RH4 1HN
UK
Phone: +1 408 246 8253
Fax: +1 408 249 6205
EMail: dcrocker@imc.org paulo@turnpike.com
说明:本人水平有限,错误难免,欢迎指正。另外原文献目录的第七段(ACKNOWLEDGMENTS)没有翻译,敬请谅解。
原文链接: