巴库斯范式
首先讲讲这么东西是干嘛的。它的英文名叫Backus–Naur Form,简写做BNF,是用发明这种格式的两位开发者的名字所命名。RFC2234 定义了扩展的巴科斯范式(ABNF,argumented BNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进,比如说,在ABNF中,尖括号不再需要。
RFC2234 标题讲的很清楚,这东西是拿来做syntax specification的,也就是描述语法、句法什么的。额,看看下面的就明白了。
RFC2234:http://www.ietf.org/rfc/rfc2234.txt
BNF
BNF的一般形式是:
<symbol> ::= __expression__
即,符号(symbol)定义为(_expression_)
其它的等效方式有:
1、用"word"代表word本身;而用()来表示双引号。
2、未使用双引号的字符为语法部分。
3、<>包含的部分为必选项。
4、[]包含的部分为可选项。
5、{}包含的内容有不定个,可以有0个,也可以有很多个。
6、|(竖线)表示逻辑or,即二者任含其一
7、::=表示“定义为”,即上面提到的一般形式。
ABNF
3、后面的没兴趣翻译了,详情请见上面的RFC文档。
BNF举例
下面是摘自wiki的一个例子:
<name-part> ::= <personal-part> <last-name> <opt-suffix-part> <EOL>
| <personal-part> <name-part>
<personal-part> ::= <first-name> | <initial> "."
<street-address> ::= <house-num> <street-name> <opt-apt-num> <EOL>
<zip-part> ::= <town-name> "," <state-code> <ZIP-code> <EOL>
<opt-suffix-part> ::= "Sr." | "Jr." | <roman-numeral> | ""
上面的意思是:
1、一个邮政地址,应该依次包含:姓名 地址 邮编;
2、一个姓名,应该依次包含personal-part last-name opt-suffix-part EOL;或者是,personal-part name-part;
3、对剩余部分依次解释。值得注意的是zip-part里面的“,”表示这里有用","分割;而前面的会有空格隔开。
4、<EOL>表示End Of Line,ascii里的标准字符。