擴(kuò)展巴科斯范式
基本
代碼,如由終結(jié)符即可視字符、數(shù)字、標(biāo)點(diǎn)符號(hào)、空白字符等組成的計(jì)算機(jī)程序的源代碼。
EBNF 定義了把各符號(hào)序列分別指派到非終結(jié)符的產(chǎn)生規(guī)則:
digit excluding zero ="1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";digit ="0"|digit excluding zero ;
這個(gè)產(chǎn)生規(guī)則定義了在這個(gè)指派的左端的非終結(jié)符 digit。豎杠表示可供選擇,而終結(jié)符被引號(hào)包圍,最后跟著分號(hào)作為終止字符。所以 digit 是一個(gè) "0" 或可以是 "1 或 2 或 3 直到 9 的一個(gè) digit excluding zero"。
產(chǎn)生規(guī)則還可以包括由逗號(hào)分隔的一序列終結(jié)符或非終結(jié)符:
twelve ="1","2";two hundred one ="2","0","1";three hundred twelve ="3",twelve ;twelve thousand two hundred one =twelve ,two hundred one ;
可以省略或重復(fù)的表達(dá)式可以通過(guò)花括號(hào) { ... } 表示:
natural number =digit excluding zero ,{digit };
在這種情況下,字符串 1, 2, ...,10,...,12345,... 都是正確的表達(dá)式。要表示這種情況,于花括號(hào)內(nèi)設(shè)立的所有東西可以重復(fù)任何次,包括根本不出現(xiàn)。
可選項(xiàng)可以通過(guò)方括號(hào) [ ... ] 表示:
integer ="0"|["-"],natural number ;
所以 integer 是一個(gè)零(0)或可能前導(dǎo)可選的負(fù)號(hào)的一個(gè)自然數(shù)。
EBNF 還包括描述指定次數(shù)的重復(fù),和排除產(chǎn)生式的某部分或向 EBNF 文法插入注釋的語(yǔ)法。
依據(jù) ISO 的擴(kuò)展
依據(jù) ISO 14977 標(biāo)準(zhǔn),提供了兩個(gè)設(shè)施來(lái)擴(kuò)展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在問(wèn)號(hào)包圍內(nèi)的任意文本,其解釋超出了 EBNF 標(biāo)準(zhǔn)的范圍。例如,空格字符可以用如下規(guī)則定義:
space =? US-ASCII character 32 ?;
其二利用圓括號(hào)在 EBNF 中不能放置到緊隨標(biāo)識(shí)符之后的事實(shí)。下列不是有效的 EBNF:
something =foo (bar );
所以 EBNF 的擴(kuò)展可以使用這種表示法。例如,在 Lisp 文法中,函數(shù)應(yīng)用可以用如下規(guī)則定義:
function application =list(symbol ,[{expression }]);
擴(kuò)展 BNF 的動(dòng)機(jī)
BNF 有著可選項(xiàng)和重復(fù)不能直接表達(dá)的問(wèn)題。作為替代,它們需要利用中介規(guī)則或兩選一規(guī)則,對(duì)于可選項(xiàng),定義要么是空的要么是可選的產(chǎn)生式的規(guī)則,對(duì)于重復(fù),遞歸的定義要么是被重復(fù)的產(chǎn)生式要么是自身的規(guī)則。同樣的構(gòu)造仍可用在 EBNF 中。
可選項(xiàng):
signed number =[sign ,]number ;
可按 BNF-風(fēng)格定義為:
signed number =sign ,number |number ;
或
signed number =optional sign ,number ;optional sign ,=ε|sign ,;(* 使用 ε 來(lái)更清晰的指示空產(chǎn)生式 *)
重復(fù):
number ={digit }digit ;
可按 BNF-風(fēng)格定義為:
number =digit |number digit;
其他增加和修改
EBNF 排除了 BNF 的一些缺陷:
BNF 為自身使用了符號(hào) (, |, ::=)。當(dāng)它們出現(xiàn)在要定義的語(yǔ)言中的時(shí)候,BNF 不能不加以修改或解釋的使用。
BNF-語(yǔ)法在一行中只表示一個(gè)規(guī)則。
EBNF 解決了這些問(wèn)題:
終結(jié)符被嚴(yán)格的包圍在引號(hào) ("..." 或 "...") 中。給非終結(jié)符的尖括號(hào) ("")可以省略。
通常使用終止字符分號(hào)結(jié)束一個(gè)規(guī)則。
進(jìn)一步還提供了定義重復(fù)次數(shù),排除法選擇(比如除了引號(hào)的所有字符)和注釋等的增強(qiáng)機(jī)制。
不管所有這些增強(qiáng),EBNF 在能定義的語(yǔ)言的意義上不比 BNF 更強(qiáng)大。在原理上用 EBNF 定義的任何文法都可以用 BNF 表達(dá)。但是經(jīng)常導(dǎo)致可觀的更多規(guī)則的表示。
EBNF 已經(jīng)被ISO用代碼 ISO/IEC 14977:1996(E) 標(biāo)準(zhǔn)化了。
在某些場(chǎng)合任何擴(kuò)展的 BNF 都被稱為 EBNF。例如W3C使用one EBNF來(lái)規(guī)定XML。
另一個(gè)例子
只允許賦值的簡(jiǎn)單編程語(yǔ)言可以用 EBNF 定義為:
(* a simple program in EBNF ? Wikipedia *)program ="PROGRAM",white space ,identifier ,white space ,"BEGIN",white space ,{assignment ,";",white space },"END.";identifier =alphabetic character ,[{alphabetic character |digit }];number =["-"],digit ,[{digit }];string =""",{all characters ?"""},""";assignment =identifier ,":=",(number |identifier |string );alphabetic character ="A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z";digit ="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";white space =? white space characters ?;all characters =? all visible characters ?;
一個(gè)語(yǔ)法上正確的程序:
PROGRAM DEMO1 BEGINA0:=3;B:=45;H:=-100023;C:=A;D123:=B34A;BON:=GIRAFFE;TEXT:="Hello world!";END.
這個(gè)語(yǔ)言可以輕易的擴(kuò)展上控制流,算術(shù)表達(dá)式和輸入/輸出指令。就可以開(kāi)發(fā)出一個(gè)小的、可用的編程語(yǔ)言了。
使用了在標(biāo)準(zhǔn)中提議為正規(guī)表示的下列字符:
約定
1. 使用了如下約定:
擴(kuò)展 BNF 每個(gè)元標(biāo)識(shí)符都被寫(xiě)為用連字號(hào)連接起來(lái)的一個(gè)或多個(gè)字;
結(jié)束于“-symbol” 的元標(biāo)識(shí)符是擴(kuò)展 BNF 的終結(jié)符的名字。
2. 表示擴(kuò)展 BNF 的每個(gè)操作符的正常字符和它所蘊(yùn)涵的優(yōu)先級(jí)(頂部為最高優(yōu)先級(jí))為:
3. 下列括號(hào)對(duì)超越正常優(yōu)先級(jí):
作為例子,下列語(yǔ)法規(guī)則展示了表達(dá)重復(fù)的設(shè)施:
這些規(guī)則定義的終結(jié)字符串如下:
有關(guān)工作
W3C使用一種不同的 EBNF來(lái)指定XML語(yǔ)法。
British Standards Institute 在1981年出版了一個(gè) EBNF 標(biāo)準(zhǔn): BS 6154。
IETF使用在 RFC 4234 中規(guī)定的擴(kuò)充 BNF(ABNF)。
參見(jiàn)
擴(kuò)充巴科斯范式
巴科斯范式
正則表達(dá)式
Spirit Parser Framework
Wirth Syntax Notation
引用
Niklaus Wirth:What can we do about the unnecessary diversity of notation for syntactic definitions?CACM, Vol. 20, Issue 11, November 1977, pp. 822-823.
Roger S. Scowen: Extended BNF — A generic base standard. Software Engineering Standards Symposium 1993.
The International standard (ISO 14977) that defines the EBNF is now freely available aszipped pdf file.
本條目部分或全部?jī)?nèi)容出自以GFDL授權(quán)發(fā)布的《自由線上電腦詞典》(FOLDOC)。
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請(qǐng)告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫(xiě)的作者,感謝每一位的分享。
![](https://imgs1.zupu.cn/static/web/img/toplogin.png)
- 有價(jià)值
- 一般般
- 沒(méi)價(jià)值
![](https://imgs0.zupu.cn/photos/common/20210831/5f77025c-05aa-4528-8ff4-390397a5720d.png)
![](https://imgs0.zupu.cn/photos/common/20210831/fc60bb85-0172-4554-b1b5-84e226beefd2.png)
![](https://imgs0.zupu.cn/photos/common/20210831/77b1b221-2263-4a50-a438-3fe70c458147.png)
![](https://imgs0.zupu.cn/photos/common/20210901/bf46d3b7-c6b5-4a58-ae45-919cadfc8f58.png)
![](https://imgs0.zupu.cn/photos/common/20210903/71ed74ca-9551-4d33-913e-aed4f1956e48.jpg)
![](https://imgs0.zupu.cn/photos/common/20210901/bf46d3b7-c6b5-4a58-ae45-919cadfc8f58.png)
![](https://imgs0.zupu.cn/photos/common/20210901/106cf47a-2bf9-43b3-8b6f-76bb2958edd9.png)
![](https://imgs0.zupu.cn/photos/common/20210903/71ed74ca-9551-4d33-913e-aed4f1956e48.jpg)
24小時(shí)熱門(mén)
推薦閱讀
知識(shí)互答
關(guān)于我們
![](https://imgs0.zupu.cn/photos/common/20210901/fc6ee093-f219-47fc-90da-21bd9721b53d.jpg)
APP下載
![](https://imgs0.zupu.cn/photos/common/20210901/ea3c7971-1e11-4045-b81c-880d962d4986.png)
![](https://imgs0.zupu.cn/photos/common/20201105/f86bb195-6306-4041-b306-d17003e00182.png)
{{item.time}} {{item.replyListShow ? '收起' : '展開(kāi)'}}評(píng)論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.time}}