RFC2234中文翻译

网络工作组                                                 D. Crocker, Ed.
请求注释: 2234                                              互联网邮件联盟
类别: 标准跟踪                                                  P. Overell
                                             Demon Internet (股份)有限公司
                                                                1997年11月


             扩展的巴科斯瑙尔范式的语法说明书:ABNF


备忘录状态

   本文档是互联网社区的一个互联网标准跟踪协议,需要进一步讨论和建议以便完
   善。请参阅最新版的“Internet正式协议标准” (STD1)来获得本协议的标准化进
   程和状态。本备忘录的发布不受限制.

版权声明

   版权属于互联网社区(The Internet Society)(1997)。版权所有,违者必究。

目录

   1.  介绍 .........................................................  2

   2.  规则定义 .....................................................  2
   2.1 规则命名 .....................................................  2
   2.2 规则形式 .....................................................  3
   2.3 终结值 .......................................................  3
   2.4 外部编码 .....................................................  5

   3.  操作符 .......................................................  5
   3.1 连接        规则1    规则2 ...................................  5
   3.2 选择        规则1 /  规则2 ...................................  6
   3.3 增量选择    规则1 =/ 规则2 ...................................  6
   3.4 值域选择    %C##-## ..........................................  7
   3.5 有序组      (规则1   规则2) ..................................  7
   3.6 循环        *规则 ............................................  8
   3.7 指定循环    n规则 ............................................  8
   3.8 可选序列    [规则] ...........................................  8
   3.9 ; 注释 .......................................................  8
   3.10 操作符优先级 ................................................  9

   4. 用ABNF定义ABNF ................................................  9

   5. 安全考虑 ...................................................... 10

   6.  附录A – 核心(规则) .......................................... 11
   6.1 核心规则 ..................................................... 11
   6.2 共公编码 ..................................................... 12

   7. 感谢 .......................................................... 12

   8. 参考资料 ...................................................... 13

   9. 联系方式 ...................................................... 13

   10. 完整版权声明 ................................................. 14

1.   介绍

   互联网技术规范经常需要定义一种语法格式可以让作者自由的使用任何符号。许
   多年后,一种改版的巴科斯瑙尔范式(BNF),称为扩展的巴科斯瑙尔范式(为了
   叙述方便,本文后面直接用ABNF表示)在许多互联网协议规范中开使流行起来。
   它平衡了简洁性(书写紧凑)和简单性(意义直观),具有合理的表达能力。以
   前ARPA计算机网络的每个技术规范都包含了自己定义的ABNF。这其中就包括了电
   子邮件(E-mail)技术规范。在RFC733和后来的RFC822,它们已经成为了定义扩
   展巴科斯瑙尔范式的公共引用。本文将ABNF的定义分离出来(独立为一个文档),
   充许其它文档选择引用。而且本文也提供了一些修改和增强。

   标准的BNF和扩展的BNF(ABNF)在命名规范,循环,选择,分组,值域上都有区别。
   附录A(核心规则)提供的一组规则定义和编码适用于一些互联网规范的核心词法分
   析器。这些核心规则是为了方便在其它文档中直接引用(而不必重新定义这些规
   则),另一方面,也是为了将它从本文正文中的元语言定义中抽取出来(在附录A中
   统一列出,以便查找),同时也是把它的正式形式分离出来。

2.   规则定义

2.1  规则命名

   一个规则名称就是它名字本身,也是一个字符序列,该序列的第一个字符是字母
   表中的字母,后面的字符可以是字母、数字和连字符("-")。   

        注意:     规则名称是大小写不敏感的(不区分大小写)。

   名称 <rulename>, <Rulename>, <RULENAME> 和 <rUlENamE> 都表示同一个规则。

   不像原来的BNF,尖括号("<", ">")不再是必须的。但是任何时候用尖括号将规
   则名括起来表示一个规则也是可以的,而且容易辨认。这种表示的典型运用就是在
   本文自由格式的行文中对规则名字的引用;或是用来区分在字符串中的未用空格符
   分割的局部规则,这种情形会在后边讨论循环时出现。

2.2  规则形式

   一个规则用下面的格式定义:

        name = elements crlf

   这里 <name> 是规则名称,<elements> 是一个或多个规则名称或终结符,<crlf>
   表示一行末尾用回车和换行符表示这一行结束。等号“=”将规则名称和规则定义
   分开。 规则定义由一个或多个规则名称和(或)值再结合本文档后面定义的各种操
   作符(如:后面会谈到的选择操作符和循环操作符等)共同构成。

   为了看着整齐,规则定义是左对齐的。一个规则需要多行表示时,后续的行需要
   缩进。所谓的左对齐和缩进是根据ABNF规则定义的第一行而言的,而不是指文档
   的左边。

2.3  终结符(值)

   规则最终会分解成一串值,有时是一串最终的字符(终结符)。在ABNF中一个字
   符就是一个非负整数。在某些情况下会指定从值到字符集(比如ASCII码表)的一
   个特殊映射(编码)。终结符是由一个或多个数字字符组成,这些数字字符的基
   本含义由其它字符明确指定。现在下面定义一些基本规则:

        b = binary        ;二进制

        d = decimal       ;十进制

        x = hexadecimal   ;十六进制

   因此:

        CR = %d13  

        CR = %x0D  

   分别指定了“CR(carriage return:回车)”的US-ASCII编码用十进制和十六进
   制的表示形式(类似C语言中printf参数格式)。

   用“.”符号分隔数值可以简洁的表示一串字符,因此:

        CRLF = %d13.10  ;回车换行

   ABNF充许直接用引号指定一串文本,因此:

        command = "command string"

   一串文本即一连串可打印字符。

        注意:     ABNF 字符串是大小写不敏感的并且这些字符串对应的是
                  US-ASCII字符集。

   因此:

        rulename = "abc"

   和:

        rulename = "aBc"

   与"abc","Abc","aBc","abC","ABc","aBC","AbC"和"ABC"都是指同一个字符串。

                要指明一个规则(字符串)是大小写敏感的,需要分别指定该串中
                的每个字符。

   例如:

        rulename = %d97 %d98 %d99

   或简写成:

        rulename = %d97.98.99

   仅是匹配由小写字母组成的字符串abc。

2.4  外部编码

   终结符(值)的字符的外部表现形式会随着存贮或传输环境而变化。因此基于同
   一ABNF的语法可以有多种外部编码形式,比如一种7比特位的US-ASCII环境,
   另一种是二进制8比特位(字节)环境,而在16比特位的Unicode环境的下编码
   又不一样。编码的详细说明超出了ABNF的范围,虽然附录A(核心规则)提供的
   是7位(二进制)的US-ASCII编码环境下ABNF的定义,但是它已经在互联上广泛
   使用。

   将外部编码形式与语法相分离,目的是为了在变化的编码环境下能使用相同的语
   法。

3.   操作符

3.1  连接                                       规则1   规则2

   通过依次列出规则名,一个规则可以定义成一个简单的按一定次序排列的串值  
   ——  也就是说一串邻接的字符,例如:

        foo    =    %x61           ; a

        bar    =    %x62           ; b

        mumble =    foo bar foo

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

        线性空白:连接处于ABNF分析模型的核心。根据ABNF定义的一个个规则对
        一串邻接的字符(值)进行分析。就互联网规范而言,过去是允许线性空白
        字符(空格符和水平制表符)在主结构(如分界特殊字符或原子字符串)两边
        自由伸展并隐含打印的。

        注意:     本文档的ABNF规范不支持对线性空白的隐式规则。

   任何语法如果充许线性空白出现在分隔符或字符串两边,必须明确指出。对于那
   些被更高层规则多次使用的“核心”规则,在其中提供空白字符常常是有用的。
   “核心”规则可以编入一个词法分析器中或简单地作为主规则集的一部分。

3.2  选择                                       规则1 / 规则2

元素被斜扛("/")分隔表示可选取其中一个。
   因此,

        foo / bar

   会接受<foo> 或 <bar>。

        注意:     一个包含字母字符的引用串,是用于说明选择字符的特殊形式,
                  它被解释为一个非终结符,该非终结符用所包含的字符,以指定
                  的顺序但可以是任意大小写的混合方式,来描述组合串集。

3.3  增量选择                                   规则1 =/规则2

   在段落中指定一列选择有时会很方便。即通过稍后的规则定义增加选择集,一个
   初始规则可能匹配一个或多个选择。这对于那些源于同一父规则集而其他方面独
   立的规范尤其有用,这种情况常出现于参数列表中。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"

   邻接的数值形式和值域形式不能在同一字符串(这里的字符串是指不包含空格的
   字符序列,空格用于隔开字符串)中出现。一个数值可以使用“.”符号的简写形
   式表示连接,或者可以用“-”符号表示一个值域。因此为了表示行序列结束符之
   间有一个可打印字符,可以写成如下格式:

        char-line = %x0D.0A %x20-7E %x0D.0A

3.5  分组(有序组)                             (规则1   规则2)

   圆括号括起来的多个元素被看成是一个元素,且在括号内元素的次序是有意义的。
   因此,

        elem (foo / bar) blat

   与 (elem foo blat) 或 (elem bar blat) 相匹配。

        elem foo / bar blat

   与 (elem foo) 或 (bar blat) 相匹配。

        注意:     当选择由多个规则名或文字组成时,强烈建议使用圆括号分组,
                  而不要依赖“空白”间隔来阅读。

   因此推荐用如下形式代替上述形式:

        (elem foo) / (bar blat)

   使用分组可以避免粗心的读者产生误解。

   分组也可用于在自由行文中将一组有序的元素从行文中分隔出来。

3.6  循环                                       *规则

   “*”出现在一个元素前表示循环。完整形式如下:   

        <a>*<b>element

   其中 <a> 和 <b> 是可选的数字,它们表示元素(element)至少出现a次,至多出
   现b次。

   默认值是0和无穷大,所以*<element>表示元素<element>可以出现任意次,包括
   0次。1*<element>表示元素<element>至少出现一次。3*3<element>表示元素
   <element>恰好出现3次,1*2<element>表示元素<element>出现1或2次。

3.7  指定循环                                   n规则

   下面的规则形式:

        <n>element

   等同于

        <n>*<n>element

   也就是说元素<element>恰好出现n次。因此 2DIGIT 表示一个两位数,3ALPHA
   表示一个包含3个字母的字符串。

3.8  可选序列                                   [规则]

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

        [foo bar]

   等同于

        *1(foo bar)

3.9  ; 注释

   从分号“;”开始到这一行结束表示一条注释。这是对规则进行注解的一个简单方
   法。

3.10 操作符优先级

   上面描述的多种机制按下面的优先次序执行。放在最上面的(结合最紧密的)优
   先级最高,最下面的(结合最松散的)优先级最低:

        字符串, 规则名
        注释
        值域
        循环
        分组, 可选序列
        连接
        选择

   选择和连接随意组合会造成混淆。

        再次提醒,建议用分组来显示的表示连接。

4.   用ABNF对ABNF进行定义。

   下面语法定义中用到了附录A(核心规则)中定义的规则。

        rulelist       =  1*( rule / (*c-wsp c-nl) )

        rule           =  rulename defined-as elements c-nl
                               ; 如果下一行以空格开始则继续

        rulename       =  ALPHA *(ALPHA / DIGIT / "-")

        defined-as     =  *c-wsp ("=" / "=/") *c-wsp
                               ; 基本规则定义及增量选择

        elements       =  alternation *c-wsp

        c-wsp          =  WSP / (c-nl WSP)

        c-nl           =  comment / CRLF
                               ; 注释或回车换行

        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
                               ; 用双引号括起来的SP和(或)VCHAR字符串

        num-val        =  "%" (bin-val / dec-val / hex-val)

        bin-val        =  "b" 1*BIT
                          [ 1*("." 1*BIT) / ("-" 1*BIT) ]
                               ; 字母"b"打头表示的二进制值

        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) ">"
                               ; 用尖括号括起来的SP和(或)VCHAR字符串
                               ; 行文描述,作为最后的表达手段


5.   安全考虑

   本文档确定不用考虑安全问题。

6.   附录A – 核心(规则)

   本附录提供了一些方便语法定义的核心(规则),这些定义的规则可做为其它规则
   的核心集(即其它规则可在它基础上进行定义)。

6.1  核心规则

   某些基本规则的名称是大的,如:SP,HTAB,CRLF,DIGIT,ALPHA等等。

        ALPHA          =  %x41-5A / %x61-7A   ; A-Z 或 a-z (某个大小写字母)

        BIT            =  "0" / "1"

        CHAR           =  %x01-7F
                               ; 任意7bit位的 US-ASCII 字符,不含NUL

        CR             =  %x0D
                               ; 回车

        CRLF           =  CR LF
                               ; 互联网标准格式的换行

        CTL            =  %x00-1F / %x7F
                               ; (所有)控制字符

        DIGIT          =  %x30-39
                               ; 0-9 (即0到9中某个数字)

        DQUOTE         =  %x22
                               ; 双引号的一半 (两相合起来表示一个双引号)

        HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

        HTAB           =  %x09
                               ; 水平制表符

        LF             =  %x0A
                               ; 换行

        LWSP           =  *(WSP / CRLF WSP)
                               ; 线性空白字符(过去的换行符)

        OCTET          =  %x00-FF
                               ; 8bit位数据 (表示一个字节数据)

        SP             =  %x20
                               ; 空格

        VCHAR          =  %x21-7E
                               ; 可视 (打印) 字符

        WSP            =  SP / HTAB
                               ; 空白字符

6.2  公共编码

   形式上数据被表示成“网络虚ASCII码”,即有8位域的7位US-ASCII编码,其
   中最高位(第8位)置0。串值按“网络字节序”排列,排在左边的高位字节在网
   络中首先传送。

7.   感谢

   扩展巴科斯瑙尔范式(ABNF)的语法最初在RFC 733中说明。SRT International
   的Ken L. Harrenstien负责将巴科斯瑙尔范式重新编码成扩展巴科斯瑙尔范式,
   这样使得描述更简短且更容易理解。

   该新近项目始于一项简单的工作,希望从RFC 822中精选出反复被非电子邮件规
   范作者引用的部分,即,扩展巴科斯瑙尔范式的描述。工作组并非简单盲目地将
   已存在的文本转变成单独的文档,而是经过15年对已有规范及相关规范优缺点的
   仔细考虑,以求进一步提高。这使项目变得比最初的想法艰巨得多。有趣的是,
   尽管作出诸如删除列表符这样的让人意外的决定,结果并非与原作非常的不同。

   最近一轮的规范由DRUMS工作组完成,感谢Jerome Abela , Harald Alvestrand,
   Robert Elz, Roger Fajman, Aviva Garrett, Tom Harsch, Dan Kohn, Bill
   McQuillan, Keith Moore, Chris Newman , Pete Resnick和Henning Schulzrinne
   的杰出贡献。  

8.   参考资料

   [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.

9.   联系方式

   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

10.  完整版权声明

   Copyright (C) The Internet Society (1997).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值