擴充套件巴科斯正規化

2021-06-06 08:28:12 字數 4753 閱讀 6957

維基百科,自由的百科全書

擴充套件巴科斯-瑙爾正規化(ebnf)是表達作為描述計算機程式語言

和形式語言

的正規方式的上下文無關文法

的元語法

符號表示法。它是基本巴科斯正規化

(bnf)元語法

符號表示法的一種擴充套件。

它最初由尼克勞斯·維爾特

開發,最常用的 ebnf 變體由標準,特別是 iso-14977 所定義。

[隱藏] 

**,如由終結符

即可視字元、數字、標點符號、空白字元等組成的電腦程式

的源**

。ebnf 定義了把各符號串行分別指派到非終結符

的產生規則

:

digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

digit = "0" | digit excluding zero ;

這個產生規則定義了在這個指派的左端的非終結符 digit。豎槓表示可供選擇,而終結符被引號包圍,最後跟著分號作為終止字元。所以 digit 是乙個 0 或可以是 1 或 2或 3 直到 9 的乙個 digit excluding zero。

產生規則還可以包括由逗號分隔的一串行終結符或非終結符:

twelve                          = "1" , "2" ;

two hundred one = "2" , "0" , "1" ;

three hundred twelve = "3" , twelve ;

twelve thousand two hundred one = twelve , two hundred one ;

可以省略或重複的表示式可以通過花括號 表示:

natural number = digit excluding zero ,  ;
在這種情況下,字串 1, 2, ...,10,...,12345,... 都是正確的表示式。要表示這種情況,於花括號內設立的所有東西可以重複任何次,包括根本不出現。

可選項可以通過方括號 [ ... ] 表示:

integer = "0" | [ "-" ] , natural number ;
所以 integer 是乙個零(0)或可能前導可選的負號的乙個自然數。

ebnf 還包括描述指定次數的重複,和排除產生式的某部分或向 ebnf 文法插入注釋的語法。

依據 iso 14977 標準,提供了兩個設施來擴充套件 ebnf。其一是在 ebnf 文法部分的特殊序列,它是在問號包圍內的任意文字,其解釋超出了 ebnf 標準的範圍。例如,空格字元可以用如下規則定義:

space = ? us-ascii character 32 ?;
其二利用圓括號在 ebnf 中不能放置到緊隨識別符號之後的事實。下列不是有效的 ebnf:

something = foo ( bar );
所以 ebnf 的擴充套件可以使用這種表示法。例如,在 lisp 文法中,函式應用可以用如下規則定義:

bnf 有著可選項和重複不能直接表達的問題。作為替代,它們需要利用中介規則或兩選一規則,對於可選項,定義要麼是空的要麼是可選的產生式的規則,對於重複,遞迴的定義要麼是被重複的產生式要麼是自身的規則。同樣的構造仍可用在 ebnf 中。

可選項:

signed number = [ sign , ] number ;
可按 bnf-風格定義為:

signed number = sign , number | number ;

signed number = optional sign , number ;

optional sign , = ε | sign , ; (* 使用 ε 來更清晰的指示空產生式 *)

重複:

number =  digit ;
可按 bnf-風格定義為:

number = digit | number digit;
ebnf 排除了 bnf 的一些缺陷:

ebnf 解決了這些問題:

進一步還提供了定義重複次數,排除法選擇(比如除了引號的所有字元)和注釋等的增強機制。

不管所有這些增強,ebnf 在能定義的語言的意義上不比 bnf 更強大。在原理上用 ebnf 定義的任何文法

都可以用 bnf 表達。但是經常導致可觀的更多規則的表示。

ebnf 已經被iso

用** iso/iec 14977:1996(e) 標準化了。

在某些場合任何擴充套件的 bnf 都被稱為 ebnf。例如 w3c

使用 one

ebnf

來規定 xml

。只允許賦值的簡單程式語言可以用 ebnf 定義為:

(* a ****** program in ebnf − wikipedia *)

program = 'program' , white space , identifier , white space ,

'begin' , white space ,

,'end.' ;

identifier = alphabetic character , [ ] ;

number = [ "-" ] , digit , [ ] ;

string = '"' , , '"' ;

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 ? ;

乙個語法上正確的程式:

program demo1 

begin

a0:=3;

b:=45;

h:=-100023;

c:=a;

d123:=b34a;

baboon:=giraffe;

text:="hello world!";

end.

這個語言可以輕易的擴充套件上控制流

,算術表示式和輸入/輸出指令。就可以開發出乙個小的、可用的程式語言了。

使用了在標準中提議為正規表示的下列字元:

用途符號表示定義=

串接,終止;

分隔|可選[ ... ]

重複分組

( ... )

雙引號" ... "

單引號' ... '

注釋(* ... *)

特殊序列

? ... ?除外-

1. 使用了如下約定:

2. 表示擴充套件 bnf 的每個操作符的正常字元和它所蘊涵的優先順序(頂部為最高優先順序)為:

* repetition-symbol

- except-symbol

, concatenate-symbol

| definition-separator-symbol

= defining-symbol

; terminator-symbol

3. 下列括號對超越正常優先順序:

´  first-quote-symbol            first-quote-symbol  ´

" second-quote-symbol second-quote-symbol "

(* start-comment-symbol end-comment-symbol *)

( start-group-symbol end-group-symbol )

[ start-option-symbol end-option-symbol ]

? special-sequence-symbol special-sequence-symbol ?

作為例子,下列語法規則展示了表達重複的設施:

aa = "a";

bb = 3 * aa, "b";

cc = 3 * [aa], "c";

dd = , "d";

ee = aa, , "e";

ff = 3 * aa, 3 * [aa], "f";

gg = , "d";

這些規則定義的終結字串如下:

aa: a

bb: aaab

cc: c ac aac aaac

dd: d ad aad aaad aaaad etc.

ee: ae aae aaae aaaae aaaaae etc.

ff: aaaf aaaaf aaaaaf aaaaaaf

gg: d aaad aaaaaad etc.

本條目部分或全部內容出自以gfdl授權發布的《自由線上電腦詞典》(foldoc)。

BNF(巴科斯正規化)

巴科斯正規化 bnf backus naur form 的縮寫 是由 john backus 和 peter naur 首次引入一種形式化符號來描述給定語言的語法 最早用於描述algol 60 程式語言 在雙引號中的字 word 代表著這些字元本身。而double quote用來代表雙引號。在雙引號...

巴科斯正規化BNF

巴科斯正規化的英文縮寫為bnf,它是以美國人巴科斯 backus 和丹麥人諾爾 naur 的名字命名的一種形式化的語法表示方法,用來描述語法的一種形式體系,是一種典型的元語言。又稱巴科斯 諾爾形式 backus naur form 它不僅能嚴格地表示語法規則,而且所描述的語法是與上下文無關的。它具有...

巴庫斯正規化

首先講講這麼東西是幹嘛的。它的英文名叫backus naur form,簡寫做bnf,是用發明這種格式的兩位開發者的名字所命名。rfc2234 定義了擴充套件的巴科斯正規化 abnf,argumented bnf 近年來在internet的定義中abnf被廣泛使用。abnf做了更多的改進,比如說,在...