擴展巴科斯範式

擴展巴科斯範式

擴展巴科斯範式是表達作為描述計算機程式語言和形式語言的正規方式的上下文無關文法的元語法符號表示法。他是由尼古拉斯·沃斯開發的。

擴展巴科斯範式擴展巴科斯範式
擴展巴科斯範式是表達作為描述計算機程式語言形式語言的正規方式的上下文無關文法的元語法符號表示法。它是基本巴科斯範式(BNF)元語法符號表示法的一種擴展。它最初由尼古拉斯·沃斯開發,最常用的EBNF變體由標準,特別是ISO-14977所定義。

基本代碼,如由終結符即可視字元數字標點符號空白字元等組成的電腦程式的原始碼。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.

這個語言可以輕易的擴展上控制流,算術表達式和輸入/輸出指令。就可以開發出一個小的、可用的程式語言了。
使用了在標準中提議為正規表示的下列字元:

相關詞條

相關搜尋

熱門詞條

聯絡我們