維基百科,自由的百科全書
擴充套件巴科斯-瑙爾正規化(ebnf)是表達作為描述計算機程式語言
和形式語言
的正規方式的上下文無關文法
的元語法
符號表示法。它是基本巴科斯正規化
(bnf)元語法
符號表示法的一種擴充套件。
它最初由尼克勞斯·維爾特
開發,最常用的 ebnf 變體由標準,特別是 iso-14977 所定義。
[隱藏]
**,如由終結符
即可視字元、數字、標點符號、空白字元等組成的電腦程式
的源**
。ebnf 定義了把各符號串行分別指派到非終結符
的產生規則
:
digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;這個產生規則定義了在這個指派的左端的非終結符 digit。豎槓表示可供選擇,而終結符被引號包圍,最後跟著分號作為終止字元。所以 digit 是乙個 0 或可以是 1 或 2或 3 直到 9 的乙個 digit excluding zero。digit = "0" | 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-symbol3. 下列括號對超越正常優先順序:- except-symbol
, concatenate-symbol
| definition-separator-symbol
= defining-symbol
; terminator-symbol
´ 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本條目部分或全部內容出自以gfdl授權發布的《自由線上電腦詞典》(foldoc)。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.
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做了更多的改進,比如說,在...