基本代碼,如由終結符即可視字元、數字、標點符號、空白字元等組成的電腦程式的原始碼。EBNF定義了把各符號序列分別指派到非終結符的產生規則:
digitexcludingzero="1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";
digit="0"|digitexcludingzero;
這個產生規則定義了在這個指派的左端的非終結符digit。豎槓表示可供選擇,而終結符被引號包圍,最後跟著分號作為終止字元。所以digit是一個0或可以是1或2或3直到9的一個digitexcludingzero。
產生規則還可以包括由逗號分隔的一序列終結符或非終結符:
twelve="1","2";
twohundredone="2","0","1";
threehundredtwelve="3",twelve;
twelvethousandtwohundredone=twelve,twohundredone;
可以省略或重複的表達式可以通過花括弧{...}表示:naturalnumber=digitexcludingzero,{digit};在這種情況下,字元串1,2,...,10,...,12345,...都是正確的表達式。要表示這種情況,於花括弧內設立的所有東西可以重複任何次,包括根本不出現。可選項可以通過方括弧[...]表示:integer="0"|["-"],naturalnumber;所以integer是一個零(0)或能前導可選的負號的一個自然數。EBNF還包括描述指定次數的重複,和排除產生式的某部分或向EBNF文法插入注釋的語法。
依據ISO的擴展依據ISO14977標準,提供了兩個設施來擴展EBNF。其一是在EBNF文法部分的特殊序列,它是在問號包圍內的任意文本,其解釋超出了EBNF標準的範圍。例如,空格字元可以用如下規則定義:space=?US-ASCIIcharacter32?;
其二利用圓括弧在EBNF中不能放置到緊隨標識符之後的事實。下列不是有效的EBNF:something=foo(bar);所以EBNF的擴展可以使用這種表示法。例如,在Lisp文法中,函式套用可以用如下規則定義:functionapplication=list(symbol,[{expression}]);
擴展BNF的動機
BNF有著可選項和重複不能直接表達的問題。作為替代,它們需要利用中介規則或兩選一規則,對於可選項,定義要么是空的要么是可選的產生式的規則,對於重複,遞歸的定義要么是被重複的產生式要么是自身的規則。同樣的構造仍可用在EBNF中。可選項:signednumber=[sign,]number;可按BNF-風格定義為:signednumber=sign,number|number;或signednumber=optionalsign,number;optionalsign=ε|sign;(*使用ε來更清晰的指示空產生式*)重複:number={digit};
可按BNF-風格定義為:number=digit|numberdigit;
其他增加和修改EBNF排除了BNF的一些缺陷:BNF為自身使用了符號(<,>,|,::=)。當它們出現在要定義的語言中的時候,BNF不能不加以修改或解釋的使用。BNF-語法在一行中只表示一個規則。
EBNF解決了這些問題:
終結符被嚴格的包圍在引號("..."或&#39;&#39;&#39;&#39;...&#39;&#39;&#39;&#39;)中。給非終結符的尖括弧("<...>")可以省略。
通常使用終止字元分號結束一個規則。
進一步還提供了定義重複次數,排除法選擇(比如除了引號的所有字元)和注釋等的增強機制。不管所有這些增強,EBNF在能定義的語言的意義上不比BNF更強大。在原理上用EBNF定義的任何文法都可以用BNF表達。但是經常導致可觀的更多規則的表示。EBNF已經被ISO用代碼ISO/IEC14977:1996(E)標準化了。在某些場合任何擴展的BNF都被稱為EBNF。例如W3C使用oneEBNF來規定XML。
另一個例子
只允許賦值的簡單程式語言可以用EBNF定義為:
(*asimpleprograminEBNF?Wikipedia*)
program=&#39;&#39;&#39;&#39;PROGRAM&#39;&#39;&#39;&#39;,WhiteSpace,identifier,whitespace,
&#39;&#39;&#39;&#39;BEGIN&#39;&#39;&#39;&#39;,whitespace,
{assignment,";",whitespace},
&#39;&#39;&#39;&#39;END.&#39;&#39;&#39;&#39;;
identifier=alphabeticcharacter,[{alphabeticcharacter|digit}];
number=["-"],digit,[{digit}];
string=&#39;&#39;&#39;&#39;"&#39;&#39;&#39;&#39;,{allcharacters?&#39;&#39;&#39;&#39;"&#39;&#39;&#39;&#39;},&#39;&#39;&#39;&#39;"&#39;&#39;&#39;&#39;;
assignment=identifier,":=",(number|identifier|string);
alphabeticcharacter="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";
whitespace=?whitespacecharacters?;
allcharacters=?allvisiblecharacters?;
一個語法上正確的程式:
PROGRAMDEMO1
BEGIN
A0:=3;
B:=45;
H:=-100023;
C:=A;
D123:=B34A;
BABOON:=GIRAFFE;
TEXT:="Helloworld!";
END.
這個語言可以輕易的擴展上控制流,算術表達式和輸入/輸出指令。就可以開發出一個小的、可用的程式語言了。
使用了在標準中提議為正規表示的下列字元: