扩展巴科斯范式

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;于…

删除容器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中用户管理的主要任务就是对“收…

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;不能直接删除 方法一…

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

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

(转)java内部类详解

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

阶段项目(一)

第四章 网页计算器&#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飘…

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

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

【bzoj2326】[HNOI2011]数学作业 矩阵乘法

题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理&#xff1a; 设有$k$位的数为$[l,r]$&#xff0c;那么枚举从大到小的第$i$个数&#xff08;即枚举$r-i1$&#xff09;&#xff0c;考虑其对$Concatenate(l..r)$的贡献&#xff1a; $v_i(r-i1)10^{k(i-1)}$ 所以要求的就…

docker search 镜像名 从仓库查找镜像

docker search 使用 想要从仓库查找镜像

Jzoj4778 数列编辑器

我们发现前四个操作可以用双向链表维护&#xff0c;而最后一个操作有一个限制就是1<k<n&#xff0c;所以可以用一个数组存在光标前面的数&#xff0c;每次维护一下前缀和就好 #include<stdio.h> #include<string.h> #include<algorithm> #define N 100…

Error response from daemon: conflict: unable to delete acdcfe83bcc5 (must be forced) - image is bein

报错如下&#xff0c;使用docker rmi 镜像名 报错了 Error response from daemon: conflict: unable to delete acdcfe83bcc5 (must be forced) - image is being used by stopped container 79e028dc2cbf 解决方法&#xff1a; 加上-f参数&#xff0c;表示强制删除 使用doc…

.NET 并行(多核)编程系列之六 Task基础部分完结篇

.NET 并行(多核)编程系列之六 Task基础部分完结篇 前言&#xff1a;之前的文章介绍了了并行编程的一些基本的&#xff0c;也注重的讲述了Task的一些使用方法&#xff0c;本篇很短&#xff0c;将会结束Task的基础知识的介绍。 本篇的主要议题如下: 1. 获取Task的状态 2. …

docker 什么是虚悬镜像

什么是虚悬镜像 仓库名、标签都是 none的镜像就是虚悬镜像(dangling image) 这种镜像需要删除&#xff0c;根据镜像ID删除该虚悬镜像 docker rmi -f [IMAGE ID]