BNF

BNF

描述計算機語言語法的符号集
巴科斯範式(BNF: Backus-Naur Form的縮寫)是由John Backus和Peter Naur首先引入的用來描述計算機語言語法的符号集。現在,幾乎每一位新編程語言書籍的作者都使用巴科斯範式來定義編程語言的語法規則。[1]在BNF中,雙引号中的字("word")代表着這些字符本身。而double_quote用來代表雙引号。
    中文名:巴科斯範式 外文名:BNF 拼音: 近義詞: 反義詞: 全稱:Backus-Naur Form 相關:John Backus和Peter Naur 特點:語法簡單,表示明确,便于語法分析和編譯

發展史

巴科斯範式(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中,尖括号不再需要。

相關詞條

相關搜索

其它詞條