扩展巴科斯范式
基本
代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码。
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 ,{digit };
在这种情况下,字符串 1, 2, ...,10,...,12345,... 都是正确的表达式。要表示这种情况,于花括号内设立的所有东西可以重复任何次,包括根本不出现。
可选项可以通过方括号 [ ... ] 表示:
integer ="0"|["-"],natural number ;
所以 integer 是一个零(0)或可能前导可选的负号的一个自然数。
EBNF 还包括描述指定次数的重复,和排除产生式的某部分或向 EBNF 文法插入注释的语法。
依据 ISO 的扩展
依据 ISO 14977 标准,提供了两个设施来扩展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在问号包围内的任意文本,其解释超出了 EBNF 标准的范围。例如,空格字符可以用如下规则定义:
space =? US-ASCII character 32 ?;
其二利用圆括号在 EBNF 中不能放置到紧随标识符之后的事实。下列不是有效的 EBNF:
something =foo (bar );
所以 EBNF 的扩展可以使用这种表示法。例如,在 Lisp 文法中,函数应用可以用如下规则定义:
function application =list(symbol ,[{expression }]);
扩展 BNF 的动机
BNF 有着可选项和重复不能直接表达的问题。作为替代,它们需要利用中介规则或两选一规则,对于可选项,定义要么是空的要么是可选的产生式的规则,对于重复,递归的定义要么是被重复的产生式要么是自身的规则。同样的构造仍可用在 EBNF 中。
可选项:
signed number =[sign ,]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 的一些缺陷:
BNF 为自身使用了符号 (, |, ::=)。当它们出现在要定义的语言中的时候,BNF 不能不加以修改或解释的使用。
BNF-语法在一行中只表示一个规则。
EBNF 解决了这些问题:
终结符被严格的包围在引号 ("..." 或 "...") 中。给非终结符的尖括号 ("")可以省略。
通常使用终止字符分号结束一个规则。
进一步还提供了定义重复次数,排除法选择(比如除了引号的所有字符)和注释等的增强机制。
不管所有这些增强,EBNF 在能定义的语言的意义上不比 BNF 更强大。在原理上用 EBNF 定义的任何文法都可以用 BNF 表达。但是经常导致可观的更多规则的表示。
EBNF 已经被ISO用代码 ISO/IEC 14977:1996(E) 标准化了。
在某些场合任何扩展的 BNF 都被称为 EBNF。例如W3C使用one EBNF来规定XML。
另一个例子
只允许赋值的简单编程语言可以用 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 ?;
一个语法上正确的程序:
PROGRAM DEMO1 BEGINA0:=3;B:=45;H:=-100023;C:=A;D123:=B34A;BON:=GIRAFFE;TEXT:="Hello world!";END.
这个语言可以轻易的扩展上控制流,算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。
使用了在标准中提议为正规表示的下列字符:
约定
1. 使用了如下约定:
扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字;
结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。
2. 表示扩展 BNF 的每个操作符的正常字符和它所蕴涵的优先级(顶部为最高优先级)为:
3. 下列括号对超越正常优先级:
作为例子,下列语法规则展示了表达重复的设施:
这些规则定义的终结字符串如下:
有关工作
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 aszipped pdf file.
本条目部分或全部内容出自以GFDL授权发布的《自由线上电脑词典》(FOLDOC)。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值