複製鏈接
請複製以下鏈接發送給好友

巴科斯範式

鎖定
巴科斯範式 以美國人巴科斯(Backus)和丹麥人諾爾(Naur)的名字命名的一種形式化的語法表示方法,用來描述語法的一種形式體系,是一種典型的元語言。又稱巴科斯-諾爾形式(Backus-Naur form)。它不僅能嚴格地表示語法規則,而且所描述的語法是與上下文無關的。它具有語法簡單,表示明確,便於語法分析和編譯的特點。BNF表示語法規則的方式為:非終結符用尖括號括起。每條規則的左部是一個非終結符,右部是由非終結符和終結符組成的一個符號串,中間一般以“::=”分開。具有相同左部的規則可以共用一個左部,各右部之間以直豎“|”隔開。 [1] 
中文名
巴科斯範式
外文名
Backus-Naur Form
所屬類型
描述計算機語言語法的符號集
英文簡寫
BNF

巴科斯範式發展歷史

約翰·巴科斯首次在ALGOL 58中實現巴科斯範式。彼得·諾爾在ALGOL 60之中,進一步發展它的概念並將它的符號加以簡化,稱其為巴科斯範式(Backus Normal Form)。但高德納主張應稱為巴科斯-諾爾範式(Backus–Naur Form),因為它不算是一種正規形式(Normal form)。

巴科斯範式內容

在雙引號中的字("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 }
term ::= factor
factor ::= identifier |
quoted_symbol |
"(" expression ")" |
"[" expression "]" |
"{" expression "}"
identifier ::= letter { letter | digit }
quoted_symbol ::= """ """

巴科斯範式擴展的內容

RFC2234 定義了擴展的巴科斯範式(ABNF)。近年來在Internet的定義中ABNF被廣泛使用。ABNF做了更多的改進,比如説,在ABNF中,尖括號不再需要。
參考資料
  • 1.    白英彩.英漢計算機技術大辭典.上海:上海交通大學出版社,2001:154