首先講講這麼東西是幹嘛的。它的英文名叫backus–naur form,簡寫做bnf,是用發明這種格式的兩位開發者的名字所命名。rfc2234 定義了擴充套件的巴科斯正規化(abnf,argumented bnf)。近年來在internet的定義中abnf被廣泛使用。abnf做了更多的改進,比如說,在abnf中,尖括號不再需要。
rfc2234 標題講的很清楚,這東西是拿來做syntax specification的,也就是描述語法、句法什麼的。額,看看下面的就明白了。
rfc2234:
bnfbnf的一般形式是:
::= __expression__
即,符號(symbol)定義為(_expression_)
其它的等效方式有:
1、用"word"代表word本身;而用()來表示雙引號。
2、未使用雙引號的字元為語法部分。
3、<>包含的部分為必選項。
4、包含的部分為可選項。
5、{}包含的內容有不定個,可以有0個,也可以有很多個。
6、|(豎線)表示邏輯or,即二者任含其一
7、::=表示「定義為」,即上面提到的一般形式。
abnf
abnf放棄了使用<>,他的定義一般形式為:
symbol = expression crlf
即,symbol被定義為expression,crlf表示一般的換行符。
另定義,crlf = %d13.10,其中%d表示這是乙個十進位制數,13.10是兩個數13和10用"."作為分隔符。
可見rfc的定義事實上做了蠻多修改細化,但是更加的規範。
定義:1、同樣用"word"表示word本身。同時,引號內的字母都應是us-ascii字元,且大小寫不敏感;若需區分大小寫,直接用字元ascii值替代即可。
2、/ 來表示or邏輯,而不是再是 |(豎線)
3、後面的沒興趣翻譯了,詳情請見上面的rfc文件。
bnf舉例
下面是摘自wiki的乙個例子:
<
postal-address
> ::= <
name-part
>
<
street-address
>
<
zip-part
>
<
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
> | ""
上面的意思是:
2、乙個姓名,應該依次包含personal-part last-name opt-suffix-part eol;或者是,personal-part name-part;
3、對剩餘部分依次解釋。值得注意的是zip-part裡面的「,」表示這裡有用","分割;而前面的會有空格隔開。
4、表示end of line,ascii裡的標準字元。
巴庫斯正規化
首先講講這麼東西是幹嘛的。它的英文名叫backus naur form,簡寫做bnf,是用發明這種格式的兩位開發者的名字所命名。rfc2234 定義了擴充套件的巴科斯正規化 abnf,argumented bnf 近年來在internet的定義中abnf被廣泛使用。abnf做了更多的改進,比如說,在...
擴充套件巴科斯正規化
維基百科,自由的百科全書 擴充套件巴科斯 瑙爾正規化 ebnf 是表達作為描述計算機程式語言 和形式語言 的正規方式的上下文無關文法 的元語法 符號表示法。它是基本巴科斯正規化 bnf 元語法 符號表示法的一種擴充套件。它最初由尼克勞斯 維爾特 開發,最常用的 ebnf 變體由標準,特別是 iso ...
BNF(巴科斯正規化)
巴科斯正規化 bnf backus naur form 的縮寫 是由 john backus 和 peter naur 首次引入一種形式化符號來描述給定語言的語法 最早用於描述algol 60 程式語言 在雙引號中的字 word 代表著這些字元本身。而double quote用來代表雙引號。在雙引號...