参考: 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 大端模式),并且最先通过网络发送。(可参见网络字节序相关文档)。