發展史
巴科斯範式(BNF:Backus-Naur Form的縮寫)是由John Backus和Peter Naur首次引入一種形式化符号來描述給定語言的語法(最早用于描述ALGOL60編程語言)。确切地說,早在UNESCO(聯合國教科文組織)關于ALGOL58的會議上提出的一篇報告中,Backus就引入了大部分BNF符号。雖然沒有什麼人讀過這篇報告,但是在Peter Naur讀這篇報告時,他發現Backus對ALGOL58的解釋方式和他的解釋方式有一些不同之處,這使他感到很驚奇。
首次設計ALGOL的所有參與者都開始發現了他的解釋方式的一些弱點,所以他決定對于以後版本的ALGOL應該以一種類似的形式進行描述,以讓所有參與者明白他們在對什麼達成一緻意見。他做了少量修改,使其幾乎可以通用,在設計ALGOL60的會議上他為ALGOL60草拟了自己的BNF。看你如何看待是誰發明了BNF了,或者認為是Backus在1959年發明的,或者認為是Naur在1960年中發明。
(關于那個時期編程語言曆史的更多細節,參見1978年8月,《Communications of the ACM(美國計算機學會通訊)》,第21卷,第8期中介紹Backus獲圖靈獎的文章。這個注釋是由來自Los Alamos Natl.實驗室的William B.Clodius建議的)。現在,幾乎每一位新編程語言書籍的作者都使用巴科斯範式來定義編程語言的語法規則。
内容
在雙引号中的字("word")代表着這些字符本身。而double_quote用來代表雙引号。
在雙引号外的字(有可能有下劃線)代表着語法部分。
尖括号(<>)内包含的為必選項。
方括号([])内包含的為可選項。
大括号({})内包含的為可重複0至無數次的項。
豎線(|)表示在其左右兩邊任選一項,相當于"OR"的意思。
::=是“被定義為”的意思。
巴科斯範式示例
這是用BNF來定義的Java語言中的For語句的實例:
FOR_STATEMENT::=
"for""("(variable_declaration|
(expression";")|";")
[expression]";"
[expression]
")"statement
這是Oracle packages的BNF定義:
package_body::="package"package_name"is"
package_obj_body
["begin"seq_of_statements]
"end"[package_name]";"
package_obj_body::=variable_declaration
| subtype_declaration
| cursor_declaration
| cursor_body
| exception_declaration
| record_declaration
| plsql_table_declaration
| procedure_body
| function_body
procedure_body::="procedure"procedure_name
["("argument{","argument}")"]
"return"return_type
"is"
["declare"declare_spec";"{declare_spec";"}]
"begin"
seq_of_statements
["exception"exception_handler]
"end"[procedure_name]";"
statement::=comment
| assignment_statement
| exit_statement
| goto_statement
| if_statement
| loop_statement
| null_statement
| raise_statement
| return_statement
| sql_statement
| plsql_block
這是用BNF來定義的BNF本身的例子:
syntax::=
rule::=identifier"::="expression
expression::=term{"|"term}
ter::=factor
factor::=identifier|
quoted_symbol|
"("expression")"|
"["expression"]"|
"{"expression"}"
identifier::letter{letter|digit}
quoted_symbol::=""""""
擴展的巴科斯範式Augmented BNF
RFC2234定義了擴展的巴科斯範式(ABNF)。近年來在Internet的定義中ABNF被廣泛使用。ABNF做了更多的改進,比如說,在ABNF中,尖括号不再需要。