巴科斯范式(也称为巴科斯-瑙尔范式、巴克斯-诺尔范式)即 BNF 是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。尽管巴科斯范式也能表示一部分自然语言的语法,它还是更广泛地使用于程序设计语 言、指令集、通信协议的语法表示中。大多数程序设计语言或者形式语义方面的教科书都采用巴科斯范式。在各种文献中还存在巴科斯范式的一些变体,如扩展巴科斯范式EBNF或扩充巴科斯范式 ABNF。

BNF 规定是推导规则(产生式)的集合,写为:

::=

这里的 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠 ‘|’ 分隔的多个符号序列构成,每个符号序列整体都是左端的符号的一种可能的替代。从未在左端出现的符号叫做终结符。

扩展巴科斯范式

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

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

基本

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

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

可按 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 BEGIN A0:=3; B:=45; H:=-100023; C:=A; D123:=B34A; BABOON:=GIRAFFE; TEXT:="Hello world!"; END.

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

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

用途符号表示

定义

=

串接

,

终止

;

分隔

|

可选

[ ... ]

重复

{ … }

分组

( … )

双引号

” … “

单引号

‘ … ‘

注释

(* … *)

特殊序列

? … ?

除外

-

约定

使用了如下约定:扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字;

结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。

表示扩展 BNF 的每个操作符的正常字符和它所蕴涵的优先级(顶部为最高优先级)为:

* repetition-symbol - except-symbol , concatenate-symbol | definition-separator-symbol = defining-symbol ; terminator-symbol

下列括号对超越正常优先级:

' 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。

ps,由于中文维基百科尚不可访问,所以就原文转载了其中关于巴科斯范式和扩展巴科斯范式的词条。

java 范式 问号_巴科斯范式和扩展巴科斯范式相关推荐

  1. java 范式 问号_冒号和他的学生们(连载9)——泛型范式

    算法是脊,数据是肉:思想是鸡,结论是蛋--题记 冒号重新开讲:"你们会不会经常遇到这种情景:一遍又一遍地写着相似的代码,有心将其归并,却因种种原因无法践行." 逗号心有戚戚焉道:& ...

  2. java jpanel 叠加_如何添加多个扩展JPanel到Java中的一个JFrame中?

    我想要两个不同类的两个图像来扩展JPanel并排. 我遇到的问题是两个JPanel应该放在JFrame中,但是当我做framename.add(panel)时,它会替换另一个,而不是并排添加其中的两个 ...

  3. java 广告插件_徒手创建一个chrome扩展-屏蔽广告插件

    创建一个文件夹,创建以下文件 maniftest.json  background.js和 icon图片 maniftest.json文件设置如下 { "name": " ...

  4. ebnf范式_(4条消息)扩展巴科斯范式(EBNF)简介

    介绍 扩展巴科斯-瑙尔范式(Extended Backus–Naur Form,EBNF)是一种用于描述计算机编程语言等正式语言的与上下文无关语法的元语法(metasyntax)符号表示法.简而言之, ...

  5. 【编译器学习】EBNF扩展巴科斯范式学习总结

    EBNF扩展巴科斯范式学习总结 是一种描述计算机编程语言且与上下文无关(没有前置条件)的语法的一种语法表达式.简而言之,就是描述语言语法的规范. EBNF的基本语法形式如下: 左手边(LeftHand ...

  6. 扩展巴科斯范式(EBNF)简介

    介绍 扩展巴科斯-瑙尔范式(Extended Backus–Naur Form,EBNF)是一种用于描述计算机编程语言等正式语言的与上下文无关语法的元语法(metasyntax)符号表示法.简而言之, ...

  7. python支持的编程范式有_转并修改:Python编程范式(Programming Paradigm)

    编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐 ...

  8. mysql三大范式 答案_数据库三大范式的个人理解~!

    下面引用的是百度文库的解释,之后是我自己的理解,如果我写的理解不了可以看下百度文库的解释! 百度文库: 范式简介编辑 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求 ...

  9. Java三行情书_函数式编程思维在三行代码情书中的应用

    函数式编程概述 如今主流的编程语言,函数式编程范式或多或少都融入其中成了"标配",或者说主流语言都在进行函数式方面的扩充,这是一个大趋势.以Java为例,随着 Lambda块 和 ...

最新文章

  1. RDKit | 基于SSSR区分环状化合物和链状化合物
  2. 易生信高级转录组分析和数据可视化第9期课程开课啦!!
  3. 陶哲轩实分析 例 1.2.12 洛必达法则使用注意事项
  4. 各类web服务器 http access log获取用户和代理ip
  5. python爬虫吧-python爬虫-爬取百度贴吧帖子加图片
  6. linux里hba状态_linux查看hba卡状态
  7. mysql yn 字段类型_mysql常用数据类型
  8. python elasticsearch模块_Python 操作 ElasticSearch
  9. 共享单车当废铁卖 ofo回应:已达报废年限
  10. 动易Ajax登陆调用
  11. uniaccess安全助手卸载_如何彻底卸载360
  12. virtualbox安装Windows server 2003
  13. 内网计算机ip地址查询,内网ip地址怎么查看_怎么查看内网ip地址_如何查看电脑的内网IP地址...
  14. cad指定许可服务器,AutoCAD许可证版本
  15. 我们为什么这么拼?(转载自微信)
  16. 基于javaweb的宠物店管理系统(java+jsp+javascript+bootstrap+mysql)
  17. Mycat的配置---雄关漫道真如铁,而今迈步从头越
  18. 使用sql如何找出两张表中同一字段的不同值
  19. Reversing:逆向工程揭密pdf
  20. 关闭谷歌更新提示“若要接收后续 google chrome 更新,您需使用 windows 10或更高版本”

热门文章

  1. Solaris底下配置samba
  2. BigDecimalf大小的比较
  3. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】
  4. linux shell declare命令 声明shell变量 显示shell函数
  5. python print 不能立即打印输出 解决方法
  6. golang map range遍历是随机顺序
  7. php laravel 框架 APP_KEY 的作用
  8. golang 理解包导入
  9. 关于windowsx.h的介绍
  10. Web服务器的工作原理