BNF是“Backus Naur Form”的縮寫。John Backus和Peter Naur首次引入一種形式化符號來描述給定語言的語法(最早用於描述ALGOL 60 編程語言,參見[Naur60])。確切地說,早在UNESCO(聯合國教科文組織)關於ALGOL 58的會議上提出的一篇報告中,Backus就引入了大部分BNF符號。雖然沒有什麼人讀過這篇報告,但是在Peter Naur讀這篇報告時,他發現Backus對ALGOL 58的解釋方式和他的解釋方式有一些不同之處,這使他感到很驚奇。首次設計ALGOL的所有參與者都開始發現了他的解釋方式的一些弱點,所以他決定對於以後版本的ALGOL應該以一種類似的形式進行描述,以讓所有參與者明白他們在對什麼達成一致意見。他做了少量修改,使其幾乎可以通用,在設計ALGOL 60的會議上他爲ALGOL 60草擬了自己的BNF。看你如何看待是誰發明了BNF了,或者認爲是Backus在1959年發明的,或者認爲是Naur在1960年中發明。(關於那個時期編程語言歷史的更多細節,參見1978年8月,《Communications of the ACM(美國計算機學會通訊)》,第21卷,第8期中介紹Backus獲圖靈獎的文章。這個註釋是由來自Los Alamos Natl.實驗室的William B. Clodius建議的)。
巴科斯範式是一種用形式化符號精確描述程序設計語言的語法的一種形式系統。又稱巴科斯-諾爾形式,簡稱BNF範式。
實際上,BNF範式等價於喬姆斯基的2型文法。它是一種典型的元語言,可以嚴格地表示語法規則,且描述的文法是上下文無關文法。
程序設計語言的語法成分,如標識符、表達式、句子等,大多可以用BNF的產生規則加以描述。
BNF範式的產生規則
BNF的元符號
::= 表示“定義爲 ”
| 表示“或者”
< > 尖括號用於括起類別名字
一條BNF的生成規則形如:
::=
說明:
1、 每個規則中只包含一個::=符號,它將規則分爲左右兩部分。左邊表示一個非終結符號(代表某個語法成分,通常對應有確定含義),也就是說它可以被"::="右邊的部分所替換。非終結符號必須用"<"和">"括起來表示它是一個非終結符號。右邊是由非終結符或 “|”與終結符組成的一個符號串,或由“|”隔開的幾個這樣的符號串。這裏終結符指程序設計語言字符集的基本字符。
2、 由一串非終結符和以其字面意義出現在規則中終結符所組成。豎線"|"可以用在兩個符號(包括終結符和非終結符)中間,表示使用"|"左邊或右邊的符號均可。
3、 "::="被定義的非終結符可以出現在"::="右邊的中,表示遞歸定義。
例:用BNF定義一個文法
S∷=AbS′|bS′|cS′
S′∷=aS′|ε
A∷=Bc|a
B∷=Sb|b
引入擴展符號的BNF範式
有些學者爲了方便使用引入了一些擴展符號:
字符
含義
[…]
可選項
{…}
重複項(可重複0或多次)
(…)
組合項
:n:n
後綴表示範圍,如::1:8,表示“用1到8個字符命名”
“
雙引號內的字符表示這些字符本身,要表示雙引號要用如下形式:” ” ”
例: 使用擴展符號定義的一個語法
syntax ::= { rule }
rule ::= identifier "::=" expression
expression ::= term { "|" term }
term ::= factor { factor }
factor ::= identifier |
quoted_symbol |
"(" expression ")" |
"[" expression "]" |
"{" expression "}"
identifier ::= letter { letter | digit }
quoted_symbol ::= """ { any_character } """
ABNF
ABNF是在BNF基礎上擴展的增強型巴克斯範式,主要用於描述文本編碼,平衡了壓縮性和簡單性,具有合理的表達能力,大多數Internet應用層標準都可用ABNF來描述.ABNF文法定義爲:
name=elements crlf
其中,“name”是規則名,“=”表示“定義爲”,“elements”是一個或多個規則名或終結符,“crlf’是回車換行,表徵一行的結束。
與BNF不同,ABNF中的中括號(“<”,“>”)不再需要。
ABNF有多種操作符,其中有四種基本的操作符:連接、選擇、循環和可選項。
1. 連接
格式: 規則1 規則2
通過列出一系列規則名,一條規則可用於定義一個簡單有序的值串--即,一連串鄰接的字符。例如:
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
因此規則與小寫字符串"aba"匹配。
2.選擇
格式: 規則1 / 規則2
由斜槓(“/”)分隔的元素是可選的。
因此,foo / bar將接受或。
選擇又包括增式選擇和值域選擇兩種
(1)增式選擇
格式: 規則1 =/ 規則2
通過稍後的規則定義增加選擇集,一個初始規則可能匹配一個或多個選擇。
oldrule =/ additional-alternatives
如:
ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
與以下說明相同:
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
(2)值域選擇
格式: %c##-##
通過使用連字符(“-”)表明可選值域的方式,可以緊縮說明可選數值域。
DIGIT = %x30-39
等同於:
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" /"7" / "8" / "9“
連接的數值和數值域不能在同一串中說明。一個數值可以用點號連接或使用連字符說明一個值域。因此,爲了在行序列結束之間說明一個可打印的字符,說明格式如下:
char-line = %x0D.0A %x20-7E %x0D.0A
3. 循環
(1)不定循環
格式: *Rule
在元素前的操作符“*”表示重複。完整形式爲:
*element
其中
(2)指定循環
格式: element
等同於 *element
即,正好出現次。
因而2DIGIT是一個2位數,而3ALPHA是一個3字母字符串。
4. 可選序列
格式: [RULE]
方括號包括了一個可選元素序列:
[foo bar] 等同於 *1(foo bar)
即foo bar出現0次或者1次
ABNF還規定了其他一些符號:
註釋 ;註釋內容
分組 (Rule1 Rule2)
BNF範式的特點
1、BNF範式主要用來描述給定語言的語法規則,具有簡單、清晰、明確和普適等特點
2、用BNF符號系統可以用形式化地用數學符號、邏輯符號描述程序語法,使得算法描述標準化
3、每一個BNF均可轉化爲語法圖
原帖:http://hi.baidu.com/yshsh/blog/item/19fbbf50ad623c6384352402.html