扩展巴科斯范式
✍ dations ◷ 2025-09-12 23:28:34 #扩展巴科斯范式
扩展巴科斯-瑙尔范式(EBNF, Extended Backus–Naur Form)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法(metalanguage)符号表示法。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。
它最初由尼克劳斯·维尔特开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。
扩展巴科斯范式是一种表达形式语言文法的代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码。
EBNF 定义了把各符号序列分别指派到非终结符的产生规则:
digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;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 , { digit } ;
在这种情况下,字符串 , , ...,,...,,... 都是正确的表达式。要表示这种情况,于花括号内设立的所有东西可以重复任何次,包括根本不出现。
可选项可以通过方括号 表示:
integer = "0" | , natural number ;
所以 integer 是一个零()或可能前导可选的负号的一个自然数。
EBNF 还包括描述指定次数的重复,和排除产生式的某部分或向 EBNF 文法插入注释的语法。
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-repeat-symbol end-repeat-symbol }? special-sequence-symbol special-sequence-symbol ?
作为例子,下列语法规则展示了表达重复的设施:
aa = "A";bb = 3 * aa, "B";cc = 3 * , "C";dd = {aa}, "D";ee = aa, {aa}, "E";ff = 3 * aa, 3 * , "F";gg = {3 * aa}, "D";
这些规则定义的终结字符串如下:
aa: Abb: AAABcc: C AC AAC AAACdd: D AD AAD AAAD AAAAD etc.ee: AE AAE AAAE AAAAE AAAAAE etc.ff: AAAF AAAAF AAAAAF AAAAAAFgg: D AAAD AAAAAAD etc.
示例
只允许赋值的简单编程语言可以用 EBNF 定义为:
(* a simple program in EBNF − Wikipedia *) program = 'PROGRAM' , white space , identifier , white space , 'BEGIN' , white space , { assignment , ";" , white space } , 'END.' ; identifier = alphabetic character , ; number = , 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 ? ;
一个语法上正确的程序:
PROGRAM DEMO1 BEGIN A0:=3; B:=45; H:=-100023; C:=A; D123:=B34A; BABOON:=GIRAFFE; TEXT:="Hello world!"; END.
这个语言可以轻易的扩展上控制流,算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。
BNF 有着可选项和重复不能直接表达的问题。作为替代,它们需要利用中介规则或两选一规则,对于可选项,定义要么是空的要么是可选的产生式的规则,对于重复,递归的定义要么是被重复的产生式要么是自身的规则。同样的构造仍可用在 EBNF 中。
可选项:
signed number = number ;
可按 BNF-风格定义为:
signed number = sign , number | number ;
或
signed number = optional sign , number ;optional sign , = ε | sign , ; (* 使用 ε 来更清晰的指示空产生式 *)
重复:
number = { digit } digit ;
可按 BNF-风格定义为:
number = digit | number digit;
EBNF 较 BNF 的优点
EBNF 排除了 BNF 的一些缺陷:
EBNF 解决了这些问题:
进一步还提供了定义重复次数,排除法选择(比如除了引号的所有字符)和注释等的增强机制。
不管所有这些增强,EBNF 在能定义的语言的意义上不比 BNF 更强大。在原理上用 EBNF 定义的任何文法都可以用 BNF 表达。但是经常导致可观的更多规则的表示。
EBNF 已经被ISO用代码 标准化了。
在某些场合任何扩展的 BNF 都被称为 EBNF。例如 W3C 使用 EBNF 来规定 XML。
依据 ISO 14977 标准,提供了两个设施来扩展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在问号包围内的任意文本,其解释超出了 EBNF 标准的范围。例如,空格字符可以用如下规则定义:
space = ? US-ASCII character 32 ?;
其二利用圆括号在 EBNF 中不能放置到紧随标识符之后的事实。下列不是有效的 EBNF:
something = foo ( bar );
所以 EBNF 的扩展可以使用这种表示法。例如,在 Lisp 文法中,函数应用可以用如下规则定义:
function application = list( symbol , );
有关工作
- W3C 使用一种不同的 EBNF 来指定 XML 语法。
- British Standards Institute 在1981年出版了一个 EBNF 标准: BS 6154。
- IETF 使用在 RFC 4234 中规定的扩充 BNF (ABNF)。
参见
- 扩充巴科斯范式
- 巴科斯范式
- 正则表达式
- 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 as zipped 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
本条目部分或全部内容出自以GFDL授权发布的《自由线上电脑词典》(FOLDOC)。
相关
- 新闻学新闻学,或译为报道学(日译)或言论学(韩译),是一种包含搜集、撰写及报导新闻的学科。在广义上,它亦包含了编辑和演示新闻专题的过程。新闻学在报业、电视、电台以及网络新媒体等各种
- 标准误标准误差(英文:Standard Error),也称标准误,即样本平均数抽样分布(英语:Sampling distribution)的标准差(英文:Standard Deviation),是描述对应的样本平均数抽样分布的离散程度及衡量对
- 悉尼悉尼市(雪梨市)(英语:City of Sydney)位于澳大利亚新南威尔士州,由悉尼中心商务区及附近的悉尼都会区的内西区的郊区组成。悉尼市是一个地方政府区域,以往的地方政府区域南悉尼市于
- 古希腊重装步兵希腊重装步兵(希腊语:ὁπλίται,hoplitai),是古希腊城邦的公民士兵,他们主要使用长枪并以密集方阵作战,其字源古希腊语ὁπλίται,是从.mw-parser-output .Polytonic{font-
- 1983年世界田径锦标赛第一届世界田径锦标赛由国际田径联合会主办,于1983年8月7日至8月14日在芬兰赫尔辛基奥林匹克体育场举行。本次比赛的奖牌竞争非常激烈。东德队以10金7银5铜的成绩排金牌榜首
- 江崎铁磨江﨑铁磨(1943年9月17日-),日本政治家,自由民主党党员,出身于爱知县一宫市。曾任国家公安委员会委员长、内阁府特命担当大臣(冲绳及北方对策担当、消费者及食品安全担当、海洋政策担
- 大象的眼泪《大象的眼泪》是美国作家莎拉·格鲁恩的第三本小说,此作品正被二十世纪福斯改编成电影,由瑞丝·薇斯朋和罗伯·派汀森分别饰演男女主角。九十多岁的雅各被家人送进了老人院。
- 曹阳 (足球教练)曹阳(1962年12月-),中国足球教练,退役足球运动员。曹阳祖籍黑龙江省,生于广东省兴宁县(今广东省梅州市代管的兴宁市)。球员时代,曹阳司职后卫,随广东省队获得四运会男足少年组冠军,之后入选中国国青队,与广东省足球队参加了五运会、六运会足球比赛,两次出战省港杯。退役之后,曹阳执教广东日之泉五年,带队从中国足球乙级联赛打进中国足球甲级联赛,卸任主教练之后出任俱乐部总经理,一年内两次担任代理主教练,带领球队保级成功。他还在2009年十一运会带领的广东队杀入决赛、摘得银牌。2013年,曹阳加盟新成立的梅州客家
- 第一代拉格伦男爵菲茨罗伊·萨默塞特第一代拉格伦男爵菲茨罗伊·詹姆斯·亨利·萨默塞特GCB,PC(1788年9月30日 - 1855年6月28日),是一位英国陆军元帅。他曾作为一名初级军官参加了半岛战争和滑铁卢战役,后来转任威灵顿公爵的军事秘书。在成为军械部长官之前,他还作为特鲁罗选区的托利党议员参政。1854年,他成为派往克里米亚,成为英国军队的指挥官:他的主要目标是保卫伊斯坦布尔,并奉命围攻俄罗斯的塞瓦斯托波尔港。在阿尔马河战役中取得初级成果后,他未能下达清晰的命令,导致了巴拉克拉瓦战役中轻骑兵的冲锋。尽管在因克曼战役中取得了进一步的成
- 沙上人沙上是中国江苏沿海地区的族群,在北起江苏射阳北部、南至上海奉贤南端,绵延1000多里的沿海地区和长江口两岸的14个县市中,都有被称作沙上人的聚居人群,其人口分布情况大致如下: