扩展的巴科斯范式(Augmented Backus–Naur Form)

来源:互联网 发布:吡拉西坦 知乎 编辑:程序博客网 时间:2024/06/07 09:34

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 formation
    comment
    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

         本附录提供了方便的具体语法的核心。

         定义可作为一套核心规则。

    ALPHA     = %x41-5A / %x61-7A ;A-Z / a-z
    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)没有翻译,敬请谅解。

原文链接:

http://www.ietf.org/rfc/rfc2234.txt