abnf笔记

267 阅读3分钟
扩展巴科斯范式abnf是Augmented BNF for Syntax Specifications 缩写。由于其简洁、准确、直观,广泛流行于互联网协议定义。
2.1 规则名
首字符字母,后跟字母、数字和连字符("-"),且大小写不敏感。

2.2 格式
规则 =  规则集合 注释 回车换行
如有多行要缩进,且左对齐

3.2 终结符
不能再被分解的规则,由终结符组成。
终结符有两种表示法:
一、字符编码值集合,%<b|d|x>前缀,点号分隔的正数集合。b、d、x分别对应二进制、十进制、十六进制
二、串,双引号括住字符集合,大小写不敏感
如有以下规则
r1 = %d97.98.99 r2 = "abc"  r3 = %x61.62.63 r4 = "Abc"
r1 r2 r3 等效
r2 r4 等效

2.4 外部编码
因储存和传输而产生字符值各种编码,如US-ASCII、utf16等,各有不同,但语法却是一致的。

3
连接、选择、增量选择、值域选择、分组、无限重复、有限重复、可选、注释

煮饭 = 量米 洗米 下锅 加热 ;煮饭这个行为由一系列有先后顺序的动作串联而成
煮饭 = 糙米 / 精米 量米 洗米 下锅 加热 ;有分支,两个串联
煮饭 = (糙米 / 精米) 量米 洗米 下锅 (煤气炉 / 电饭煲) ;分组分支,四个串联

下面两个规则
米 = 籼米 / 粳米 / 糯米
米 =/ 香米 / 西米 / 黄米
等同于下面一个规则
米 = 籼米 / 粳米 / 糯米 / 香米 / 西米 / 黄米

DIGIT  =  %x30-39 
DIGIT  =  "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

ALPHA = %0x41-5A / %0x61-7A ;阿位伯字母
WORD = 1*ALPHA ;词是由单字母或多字母组成等同于WORD = ALPHA *ALPHA
WORD = 3*3ALPHA ;3字母单词等同于WORD = 3ALPHA
WORD = 3*8ALPHA ;至少3字母,至多8字母的单词
name = 1*ALPHA [digit] ;名字由一个或多个字母组成,后面数字带可不带

3.10
优先级由高至低顺序是 
字符串>规则名>注释>值域>循环>分组>可选序列>连接>选择
有时过多组合会造成混淆,可用分组

6.1  核心规则
    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
                           ; 空白字符
                           
   
   

由上面核心规则,用abnf定义自身 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字符串
                           ; 行文描述,作为最后的表达手段