介绍

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

最初由尼克劳斯·维尔特开发,最常用的EBNF变体由标准是 ISO-14977 所定义。

EBNF的基本语法形式如下,这个形式也被叫做production

左式(LeftHandSide) = 右式(RightHandSide).

左式也被叫做 非终端符号(non-terminal symbol),而右式则描述了其的组成。

终端符号与非终端符号

  • 终端符号(Terminal symbols):形成所描述的语言的最基本符号。所描述语言的标点符号(不是EBNF自己的)会被左右加引号(它们也是终端符号),而其他终端符号会用粗体(这边因不方便加粗,就不加粗了)打印。
  • 非终端符号:是用于描述语法的变量,它必须被定义在一个production中。或说,它们必须出现在某个地方的production的左式中。

符号

下表是 推荐标准ISO/IEC 14977 所定义的符号:

约定

1 .使用了如下约定:

  • EBNF的每个元标识符(meta-identifier)都被写为用连字符(“-“,hyphens)连接起来的一个或多个单词;
  • 以 “-symbol” 结束的元标识符是EBNF的终端符号。

2 .用普通字符表示的EBNF操作符按照优先级(顶部为最高优先级)排序为:

*repetition-symbol(重复符)
-except-symbol(除去符)
, concatenate-symbol(连接符)
| definition-separator-symbol
= defining-symbol(定义符)
; terminator-symbol(结束符)
. terminator-symbol(结束符)

3 .以下的括号对(bracket pairs)能够改变优先级,括号对间也有优先级(顶部为最高优先级):

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

扩展

除了标准的定义,在FREESCALE文档中还使用了以下约定:

  • 计数重复:任何由”{“和”}”括起来并后跟一个上标x的东西必须准确地重复出现x次。x也可能是一个非终端字符。比如下例中,Stars相当于四个星号:
    Stars = {“*”}4.
  • 字节数:见到任何紧跟着由一对中括号“[”和“]”括起来的数字n的标识符,都应该认为它是一个高位字节在前的二进制数,并且字节数为n,如:
    Struct=RefNo FilePos[4].
  • 在一些例子中,我们会使用”<”和”>”括起来一些文本。这些文本是 元文本(meta–literal),它们的位置应该被它们所描述的东西替代掉,如,对于 < any char >,它的位置可以插入任意字符。

示例

以下提供一些示例以直观的理解EBNF。

digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
digit                = "0" | digit excluding zero ;
natural number = digit excluding zero, { digit } ;
integer = "0" | [ "-" ], natural number ;

digit excluding zero 可以是 1到9任意一个字符,digit则扩展为0到9任意一个字符。
natural number可以是1、2、…、10、…、12345、…,因为{}代表重复任意次,包括0次。
integer则可以是0或者可能带个负号的自然数。

这是用EBNF描述的EBNF自身语法:

Production     = NonTerminal "=" Expression ".".
Expression     = Term {"|" Term}.
Term           = Factor {Factor}.
Factor         = NonTerminal| Terminal| "(" Expression ")"| "[" Expression "]"| "{" Expression "}".
Terminal       = Identifier | “"“ <any char> “"“.
NonTerminal    = Identifier.

非终端符号可以是任意你喜欢的名字,而终端符号则要不然是出现在被描述的语言中的标识符,要不然就是任何被引号括起来的字符序列。
然后Factor(参数)可以是终端字符、非终端字符、三种括号中任意一种括起来的表达式。
Term(术语)由起码一个Factor组合而成……

用EBNF描述的一个只能赋值的类PASCAL编程语言:

 (* a simple program syntax 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 DEMO1BEGINA:=3;B:=45;H:=-100023;C:=A;D123:=B34A;BABOON:=GIRAFFE;TEXT:="Hello world!";END.

参考文献

[1] Freescale semiconductor. HC(S)08/RS08 and S12(X) Build Tools Utilities Manual. 2010
[2] Extended Backus–Naur form. https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form

扩展巴科斯范式(EBNF)简介相关推荐

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

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

  2. 扩展巴科斯范式 EBNF

    EBNF Extended Backus–Naur Form 定义: 代码,如由终结符即可视字符.数字.标点符号.空白字符等组成的计算机程序的源代码. | 竖杠表示可供选择, "-" ...

  3. java 范式 问号_巴科斯范式和扩展巴科斯范式

    巴科斯范式(也称为巴科斯-瑙尔范式.巴克斯-诺尔范式)即 BNF 是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言.尽管巴科斯范式也能表示一部分自然语言的语法,它还是更广泛地使用于 ...

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

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

  5. ebnf范式_BNF范式(巴科斯范式)简介

    BNF就是巴科特·瑙尔式的缩写, 在计算机的史前时代(1950s),曾有一位大师,他奠定了现代计算机的基础,在他老人家的诸多成就之中,包括了对形式语言的研究,和发明了高级语言:FORTRAN. 为了纪 ...

  6. BNF范式(巴科斯范式)简介

    BNF 规定是推导规则(产生式)的集合,写为: <符号> ::= <使用符号的表达式> 这里的 <符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠'| ...

  7. BNF 范式(巴科斯范式)简介

    转自:https://www.cnblogs.com/huiyenashen/p/4445676.html BNF 规定是推导规则(产生式)的集合,写为: <符号> ::= <使用符 ...

  8. 巴科斯范式(EBNF, Extended Backus–Naur Form)

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

  9. 什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF

    什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF                 什么是巴科斯范式?      巴科斯范式(BNF: Bac ...

最新文章

  1. UI培训教程分享:UI设计的分类有哪些?
  2. ssh-keygen-基础使用
  3. jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作
  4. World Wind Java开发之一(转)
  5. 交际能力弱的人,适合当律师吗?
  6. 容量规划的一些探讨与实践
  7. selenium借助AutoIt识别上传文件Java篇
  8. 数据分析师初级—中级—高级,每个阶段都需要学习什么?
  9. ISO9001:2000标准的主要特点和要求(转载)
  10. mean shift segmentation matlab,Mean Shift图像分割算法的并行化
  11. 极速下载!利用插件破解百度云限速
  12. NS3 Tutorial 中文版:第三章 快速上手
  13. 网络爬虫在电商定价策略上的应用
  14. 时间复杂度分析:递归算法
  15. 计算机体系结构:Chapter 5 :ILP(指令级并行)
  16. 6款换脸软件下载推荐!
  17. 计算机专业买什么商务本好,单位购买什么笔记本的比较多?各位能不能说来听听?华硕笔记本电脑哪个系列性价好,商务办公用?...
  18. C# webBrowser 通过代理访问网页
  19. 沁恒低功耗M0单片机CH579功耗低至0.2uA——带蓝牙USB以太网等接口
  20. Android开发之模拟器

热门文章

  1. (一)目标检测-R-CNN模型
  2. Python Web 深度学习实用指南:第四部分
  3. SQL Server约束
  4. Git分布式版本控制工具(Git命令基本操作)
  5. python画城堡_Python 13 简单项目-堡垒机
  6. 设置NPM淘宝镜像源,以及还原镜像源至默认
  7. 3.3 SRAM和DRAM
  8. C++ 动态分配内存的好处
  9. 男人 你能留住肌肉吗?
  10. 科大讯飞离线关键词识别(语法识别)(2)