扩展巴科斯范式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

扩展巴科斯范式

维基百科,自由的百科全书

扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。

它最初由尼古拉斯·沃斯开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。

目录

  [隐藏]
  • 1 基本
  • 2 依据 ISO 的扩展
  • 3 扩展 BNF 的动机
  • 4 其他增加和修改
  • 5 另一个例子
  • 6 约定
  • 7 有关工作
  • 8 参见
  • 9 引用
  • 10 外部链接

[编辑]基本

代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码。

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

在这种情况下,字符串 12, ...,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 } ;

可按 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;BABOON:=GIRAFFE;TEXT:="Hello world!";
END.

这个语言可以轻易的扩展上控制流,算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。


使用了在标准中提议为正规表示的下列字符:

用途符号表示
定义=
串接,
终止 ;
分隔|
可选[ ... ]
重复{ ... }
分组( ... )
双引号" ... "
单引号' ... '
注释(* ... *)
特殊序列 ? ... ?
除外-

[编辑]约定

1. 使用了如下约定:

  • 扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字;
  • 结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。

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  ]
{  start-repeat-symbol            end-repeat-symbol  }
?  special-sequence-symbol   special-sequence-symbol ?

作为例子,下列语法规则展示了表达重复的设施:

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

这些规则定义的终结字符串如下:

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.

[编辑]有关工作

  • 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.

[编辑]外部链接

  • 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)。

转载于:https://my.oschina.net/zengsai/blog/4642

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20100519 学习记录:asp CreateFolder/上传附件

新增一个上传附件的功能。在网上找了一下&#xff0c;基本都是在化境HTTP上传程序基础上改的&#xff0c;灰常感谢这个源代码的开发者&#xff0c;深深鞠躬。不过这个代码要求在上传图片时&#xff0c;输入的文件夹必须是已存在的文件夹&#xff0c;不然就会出错&#xff0c;于…

洛谷P1420 最长连号

题目描述 输入n个正整数&#xff0c;&#xff08;1<n<10000),要求输出最长的连号的长度。&#xff08;连号指从小到大连续自然数&#xff09; 输入输出格式 输入格式&#xff1a; 第一行&#xff0c;一个数n; 第二行&#xff0c;n个正整数&#xff0c;之间用空格隔开。 输…

删除容器docker rm和强制删除容器docker rm -f

显示所有容器 docker ps -a删除容器&#xff0c;运行中的容器不行 docker rm 容器id强制删除容器&#xff0c;运行中的容器也是可以删除的 docker rm -f 容器iddocker rm 删除运行中的容器会报错 Error response from daemon: You cannot remove a running container 8c03b6c4d…

Exchange2007 从零到入门(2)---收件人管理

Exchange2007 从零到入门---收件人管理在上一次的文章中讲到了如何为企业部署安装exchange2007服务器。但是部署完成的服务器还并不能使用。因为现在的服务器中还没有用户。在exchange中&#xff0c;用户被称作为“收件人”&#xff0c;exchange中用户管理的主要任务就是对“收…

测试对bug如何分析和定位

如何去区分一个功能测试工程师的水平高和低&#xff1f; 可以从很多个方面去检查&#xff0c;比如测试的思路&#xff0c; 比如测试用例的覆盖度&#xff1f;&#xff0c;比如测试出bug是否能够定位到根因&#xff1f; 上面说的各个方面都很合理&#xff0c;那我们平常如何如更…

Error response from daemon: You cannot remove a running container 8c03b6c4da31d435bcaf8c4a6c59938c3b

Error response from daemon: You cannot remove a running container 8c03b6c4da31d435bcaf8c4a6c59938c3b668eaff36903b13583329034508135. Stop the container before attempting removal or force remove原因&#xff1a;该容器正在运行中&#xff0c;不能直接删除 方法一…

DNS 错误事件4000 4013

DNS 错误事件4000 4013&#xff0c;无法创建活动目录本身的区域 WINDOWS 2003 DNS服务器无法解析 错误ID 4000 DNS 服务器无法打开 Active Directory。这台 DNS 服务器配置成为这个区域获得并 使用目录中信息并且没有它便不能加载区域。请检查 Active Directory 操作正常并 重新…

Android零基础入门第81节:Activity数据传递

在Android开发中&#xff0c;经常要在Activity之间传递数据。前面也学习了Activity和Intent相关基础&#xff0c;接下来一起来学习Activity的数据传递。 一、简介 通过前面的学习知道&#xff0c;Intent可以用来开启Activity&#xff0c;同样它也可以用来在Activity之间传递数据…

如何快速删除打印机任务

在使用打印机的时候经常回遇到打印机任务栏中的任务总是处于"正在删除"的状态这往往让办公室里的GG MM们等让十几分钟的时间,我在这里告诉大家一个简单快速的方法来快速的删除任务栏中的打印任务.那就是重新启动print spooler服务:1.首先在开始-运行中输入CMD进入DOS…

(转)java内部类详解

本文转自http://www.cnblogs.com/dolphin0520/p/3811445.html&#xff0c;谢谢作者 说起内部类这个词&#xff0c;想必很多人都不陌生&#xff0c;但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多&#xff0c;用得最多的是在有事件监听的情况下&#xff0c;并且即…

vue axios

vue axios全攻略 不再继续维护vue-resource&#xff0c;并推荐大家使用 axios 开始&#xff0c;axios 被越来越多的人所了解。本来想在网上找找详细攻略&#xff0c;突然发现&#xff0c;axios 的官方文档本身就非常详细&#xff01;&#xff01;有这个还要什么自行车&#xff…

阶段项目(一)

第四章 网页计算器&#xff08;1&#xff09;前台页面设计&#xff1a;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />&#xff08;2&#xff09;预览效果&#xff1a;&#xff08;3&#xff09;后台代码编写&#xff1…

9款超绚丽的HTML5/CSS3应用和动画特效

HTML5 现在已经不是很前卫的东西了&#xff0c;越来越多的网站和移动应用都在不断地尝试使用HTML5来更好地优化用户体验。今天我们要分享9款超绚丽的HTML5/CSS3应用和动画特效&#xff0c;这里面有菜单、按钮、图片、Loading加载动画等&#xff0c;一定会有你需要的。 1、CSS3飘…

word中取消自动目录超链接的方法

把所有的超链接按CtrlShiftF9取消后&#xff0c;就变成黑色字也没有下划线了 [方法1] 按 CtrlA 全选&#xff0c;然后再按 CtrlShiftF9。 [方法2] 其实一个比较简单的办法是先贴在notepad里&#xff0c;然后再剪切复制进 word。如果你用的是word2003&#xff0c;粘贴后在底…

莫队算法

莫队在知乎回答了一波&#xff0c;推荐了一篇博客&#xff0c;但原网址挂了。最后凭借搜狗的网页快照&#xff0c;我终于一睹这篇博客的真容。 例题 &#xff08;2010年国家集训队论文答辩&#xff09;小K的袜子 对于询问\([L,R]\)&#xff0c;设其中颜色为\(x,y,z...\)的袜子的…

网站服务器被别人绑定域名了怎么办(nginx)?

为什么80%的码农都做不了架构师&#xff1f;>>> 网站服务器被别人绑定域名了怎么办&#xff08;nginx&#xff09;? 解决办法 两种解决方案&#xff1a;nginx 的默认虚拟主机在用户通过IP访问 &#xff0c;或者通过未设置的域名 访问&#xff08;比如有人把他自己…