学习BNF ABNF范式

参考:    https://blog.csdn.net/sinolover/article/details/78626090 
    https://blog.csdn.net/u011052072/article/details/18706429 巴科斯(BNF: Backus-Naur Form)范式的内容

参考:https://blog.csdn.net/shaonian_wuya/article/details/9325445  扩展的巴科斯范式(Augmented Backus–Naur Form)

选了主要部分尽量放在了一页内以方便查看:

一BNF:(Backus-Naur Form)
    在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
    在双引号外的字(有可能有下划线)代表着语法部分。
    尖括号( < > )内包含的为必选项。
    方括号( [ ] )内包含的为可选项。
    大括号( { } )内包含的为可重复0至无数次的项。
    竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
    ::= 是“被定义为”的意思。
二ABNF:(Augmented Backus-Naur Form)
ABNF 基于BNF,在RFC2234中对其进行了语法定义,被RFC文档广泛使用,用来描述互联网协议。
ABNF和BNF的主要区别:引入了命名规则(naming rules)、repetition、alternatives、order-independence和value ranges。
2.1 规则名称 -- Rule Name规则命名规则由字母、数字和连字符(hyphens)组成,必须以字母开头。
    规则名称不区分大小写(case-insensitive),因此,规则名<rulename>、<Rulename>指向同一个规则。
    尖括号(“<”,“>”)包围规则名不是必需的。
2.2 规则格式 -- Rule Form      规则的定义如下:rulename = elements crlf
 等号的左边rulename表示规则名,右边表示规则的定义,规则的定义一般由规则序列(elements)、行结束标志(<crlf>)组成。
2.3 终结符值--Terminal Values  终结符值有时也叫字符,一串终结符值的组合即为规则。
  终结符由一个或者多个数字字符说明,这些数字字符代表的含义由其它字符给出,可以参见ASCII码表。
  数字字符表示方式可以为十进制%d、二进制%b、十六进制%x.如:'a' = %d97  'a' = %x61'a' = %b1100001
  用'.'可以实现连续串值的压缩表示。例如:ab = %d97.98
  行结束标志与终结符值并不是一回事,可以用终结符值(CL CR)表示行结束标志。
  可以用双引号表示文字串,例如,"print "表示文字串print ,忽略字符串内的magic字符,例如,%d在双引号内仅代表串"%d"。
  文字串不区分大小写。如只想匹配abc,应该写成如下的格式:rulename = %d97 %d98 %d99 或者rulename = %d97.98.99        
3.1  连接 --concatenaation  空格代表连接符。
     Rule = Rule1 Rule2
     例如,为匹配字符串"aba",首先应该定义以下两种规则:fu = %x61;bar = %x62; 然后定义匹配"aba"的规则 mumble  = fu bar fu 
3.2 选择 -- Alternative  /表示可选符
       Rule = Rule1 / Rule2 由斜杠("/")分割的元素是可选的。
3.3 扩充选择 -- Incremental alternatives  =/扩充选择符
      Rule =/ Rule1  将Rule1附加到Rule.          
3.4 值域选择 -- Value Range Alternatives
      可以使用连字符("-")表明可选值的域,表达更加简洁。如用DIGIT= %x30-35表示 DIGIT = "0" / "1" / "2" / "3" / "4" / "5"
3.5  序列组 -- Sequence Group
    在括号内出现的内容必须作为单一的element,并且内容出现的顺序也是严格要求的。
     建议尽可能的使用括号,避免歧义.eg.  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表示三个字母的字符串。
3.8 可选序列 -- Optional Sequence
    用方括号表征可选序列:[foo bar] 等价于 *1(foo bar) 0*1(foo bar) 
3.9 注释 -- comment
    从分号";"开始到一行的结束都代表注释.
3.10 操作符的优先级 -- operator Precedence
    需要注意的事项:随意混用选择操作符和连接操作符,会引起混淆。推荐使用分组操作符明确区分具有相互关系的组。
4.   用ABNF定义ABNF(ABNF DEFINITION OF ABNF)
       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 
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 大端模式),并且最先通过网络发送。(可参见网络字节序相关文档)。

猜你喜欢

转载自blog.csdn.net/DANFBAORE/article/details/84570390
BNF