扩展巴科斯范式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字符串
; 行文描述,作为最后的表达手段