扩展巴科斯范式
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
擴(kuò)展巴科斯范式
維基百科,自由的百科全書(shū)
擴(kuò)展巴科斯-瑙爾范式(EBNF)是表達(dá)作為描述計(jì)算機(jī)編程語(yǔ)言和形式語(yǔ)言的正規(guī)方式的上下文無(wú)關(guān)文法的元語(yǔ)法符號(hào)表示法。它是基本巴科斯范式(BNF)元語(yǔ)法符號(hào)表示法的一種擴(kuò)展。
它最初由尼古拉斯·沃斯開(kāi)發(fā),最常用的 EBNF 變體由標(biāo)準(zhǔn),特別是 ISO-14977 所定義。
目錄? [隱藏]
|
[編輯]基本
代碼,如由終結(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 } ;可按 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 都被稱(chēng)為 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;BABOON:=GIRAFFE;TEXT:="Hello world!"; END.這個(gè)語(yǔ)言可以輕易的擴(kuò)展上控制流,算術(shù)表達(dá)式和輸入/輸出指令。就可以開(kāi)發(fā)出一個(gè)小的、可用的編程語(yǔ)言了。
使用了在標(biāo)準(zhǔn)中提議為正規(guī)表示的下列字符:
| 定義 | =
| 串接 | ,
| 終止 | ?;
| 分隔 | |
| 可選 | [ ... ]
| 重復(fù) | { ... }
| 分組 | ( ... )
| 雙引號(hào) | " ... "
| 單引號(hào) | ' ... '
| 注釋 | (* ... *)
| 特殊序列 | ?? ...??
| 除外 | -
[編輯]約定
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í))為:
* repetition-symbol - except-symbol , concatenate-symbol | definition-separator-symbol = defining-symbol ; terminator-symbol3. 下列括號(hào)對(duì)超越正常優(yōu)先級(jí):
′ 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 ] { start-repeat-symbol end-repeat-symbol } ? special-sequence-symbol special-sequence-symbol ?作為例子,下列語(yǔ)法規(guī)則展示了表達(dá)重復(fù)的設(shè)施:
aa = "A"; bb = 3 * aa, "B"; cc = 3 * [aa], "C"; dd = {aa}, "D"; ee = aa, {aa}, "E"; ff = 3 * aa, 3 * [aa], "F"; gg = {3 * aa}, "D";這些規(guī)則定義的終結(jié)字符串如下:
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.[編輯]有關(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.
[編輯]外部鏈接
- Article "EBNF: A Notation to Describe Syntax (PDF)" by?Richard E. Pattis?describing the functions and syntax of EBNF
- Article "BNF and EBNF: What are they and how do they work?" by?Lars Marius Garshol
- Article "The Naming of Parts" by?John E. Simpson
- ISO/IEC 14977?: 1996(E)
- RFC 4234?- Augmented BNF for Syntax Specifications: ABNF
- BNF/EBNF variants?- a table by Pete Jinks comparing several syntaxes.
- Create syntax diagrams from EBNF
本文全部或部分內(nèi)容來(lái)自以GFDL授權(quán)發(fā)布的《自由線上電腦詞典》(FOLDOC)。
轉(zhuǎn)載于:https://my.oschina.net/zengsai/blog/4642
總結(jié)
- 上一篇: 详解大小额支付与超级网银
- 下一篇: Asp.net TextBox常规输入验