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

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

<符号> ::= <使用符号的表达式>

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

基本原理
      BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。BNF语法定义的语言只不过是一个字符串集合,你可以按照下述规则书写,这些规则叫做书写规范(生产式规则),形式如下:
      symbol := alternative1 | alternative2 ...
      每条规则申明:=左侧的符号必须被右侧的某一个可选项代替。替换项用“|”分割(有时用“::=”替换“:=”,但意思是一样的)。替换项通常有两个符号和终结符构成。之所以叫做终结符是因为没有针对他们的书写规范,他们是书写过程的终止(符号通常被叫做非终止符,也有人叫非终端)。

BNF就是巴科特·瑙尔式的缩写, 在计算机的史前时代(1950s),曾有一位大师,他奠定了现代计算机的基础,在他老人家的诸多成就之中,包括了对形式语言的研究,和发明了高级语言:FORTRAN。 为了纪念他老人家,我们把他提出的一套描述语言的方法叫做BNF。它以递归方式描述语言中的各种成分,凡遵守其规则的程序就可保证语法上的正确性。BNF由于其简洁、明了、科学而被广泛接受,成为描述各种程序设计语言的最常用的工具。
       其实BNF很简单,::=表示定义     |表示或    尖括号(<>)括起来的是非终结符 
  所谓非终结符就是语言中某些抽象的概念不能直接出现在语言中的符号,终结符就是可以直接出现在语言中的符号。
  比如:C语言的声明语句可以用BNF这样描述: 
  <声明语句> ::= <类型><标识符>; | <类型><标识符>[<数字>]; 
  这一句中<声明语句>这个非终结符被定义成了两种形式(上面用|隔开的两部分),同时在这里引入了三个终结符: 分号; 左方括号[,右方括号 ]。 
  <类型> ::= <简单类型> | <指针类型> | <自定义类型> 
  <指针类型> ::= <简单类型> * | <自定义类型> * 
  <简单类型> ::= int|char|double|float|long|short|void 
  <自定义类型> ::= enum<标识符>|struct<标识符>|union<标识符>|<标识符>
  到这里就基本上把<类型>定义清楚了。

  <数字> ::= 0x<十六进制数字串> | 0<八进制数字串> | <十进制数字串> 
  <十六进制数字串> ::= <十六进制数字> | <十六进制数字串><十六进制数字> 
  <八进制数字串> ::= <八进制数字> | <八进制数字串><八进制数字> 
  <十进制数字串> ::= <十进制数字> | <十进制数字串><十进制数字> 
  <十六进制数字> ::= <十进制数字> | A | B | C | D | E | F 
  <十进制数字> ::= <八进制数字> | 8 | 9 
  <八进制数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 
  到这里就把<数字>定义清楚了

  <标识符> ::= <字母> | <标识符> <字母数字串> 
  <字母数字串> ::= <字母>|<十进制数字>|<字母数字串><字母>|<字母数字串><十进制数字> 
  <字母> ::= _ | <大写字母> | <小写字母> 
  <小写字母> ::= a|b|c|d|e|f|g|h|i|j ……  
  <大写字母> ::= A|B|C|D|E|F|G|H|I|J …… 
  到此为止整个声明语句就定义完了(就是说已经没有非终结符了)。

虽然看起来很繁,但前面定义的各种非终结符都可以很容易的在别的地方重用。比如,函数声明可以定义成下面的样子: 
  <函数声明语句> ::= <类型><标识符>(<形参表>); 
  <形参表> ::= <类型><标识符> | <形参表>,<形参表> 
  只用两句就描述完了,所以BNF实际上比用自然语言要简练得多(整个C语言只用一二百句就可以描述清楚),而且相当的精确,不会有自然语言中那种模棱两可的表达。如果你对BNF比较敏感的话,会发现C里面的标识符不能由数字开头,而且在C里面下划线是被当做字母看待的(也就是说能用字母的地方都可以用下划线)。
  另外,还有一种EBNF就没有正宗的BNF这么爽了,也有很多人在用,前面的那些递归的定义被写成了{}。
   有一段时间PASCAL爱好者们喜欢用一个叫语法图的东西,画出来很难看,但功能和BNF差不多,现在好象已经没多少人用了。
     近几年流行另一种东西: 
  digit = one of 0 1 2 3 4 5 6 7 8 9 
  这里非终结符digit用斜体表示,one of是这种方法里定义的一个量词(常用斜黑体)。

时间: 2024-10-05 23:49:59

BNF范式(巴科斯范式)简介的相关文章

扩充巴科斯范式(ABNF)

BNF:巴科斯范式ABNF(Augmented Backus-Naur Form):扩充巴科斯范式 ABNF是由第68号互联网标准(”STD 68″,大小写样式按照原文)定义的,也就是 RFC 5234,经常用于互联网工程任务组(IETF)通信协议的定义语言.RFC 5234 取代了 RFC 4234(取代了 RFC 2234). 学习ABNF:ABNF规则的介绍 获取RFC对应的ABNF文件:在 这里 输入RFC number就可以获得该RFC对应的ABNF文件了. ABNF Parser G

触手不及(巴科斯范式求表达式树)

本题为学军神犇 cxt 出的神题. 题意 为了避免流露出自己的感情伤害别人, 小 M.M.T. 决定通过一个表达式来传递心意. 给出一个等式. 等式左边是一个 \(int\) 范围内的数, 等式右边是一个合法的 c++ 表达式. 例如:\(233 = 66 ? 4 ? 31\) 保证等式右边只包含数字 \(x (x ∈ [0, p),p\) 是给定的质数\()\), 加号, 减号, 乘号, 除号, 左右括号. 保证等式中没有任何空格,tab 等不可见字符. 而且保证合法. 但是遗憾的是, 因为一

BNF 和 ABNF 扩充巴科斯范式 了解

BNF 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集.现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则. 在BNF中,双引号中的字("word")代表着这些字符本身.而double_quote用来代表双引号. 在双引号外的字(有可能有下划线)代表着语法部分. < > : 内包含的为必选项. [ ] : 内包含的为可选项. { } :

巴科斯范式和sql语言

查询Mysql帮助文档,如何写SQL语句的时候,需要注意SQL语法,这里就需要知道BNF巴科斯范式. 巴科斯范式:BNF用于描述计算机语言.基本的规则如下: 尖括号<> 内包含的为必选项. 方括号[]   内包含的为可选项. 大括号{}  内包含的为可重复0至无数次的项. 竖线|       表示在其左右两边任选一项,相当于"OR"的意思. ::=         是被定义为的意思. Mysql的语法基本符合巴科斯范式,但有一些不同,如下: {} 表示必选项, ,... 表

扩充巴科斯-瑙尔范式 ABNF简介

扩充巴科斯-瑙尔范式(ABNF)是一种基于巴科斯-瑙尔范式(BNF)的元语言,但它有自己的语法和派生规则.ABNF的原动原则是描述一种作为双向通信协议的语言. ABNF是由第68号互联网标准("STD 68",大小写样式按照原文)定义的,也就是 RFC 5234,经常用于互联网工程任务组(IETF)通信协议的定义语言.RFC 5234 取代了 RFC 4234(取代了 RFC 2234 http://oss.org.cn/man/develop/rfc/RFC2234.txt). 有关

数据库范式?编辑 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

数据库范式 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF)和第五范式(5NF,还又称完美范式). 第一范式(1NF) 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,

关系数据库的范式和反范式设计

关于范式 Normal Form 范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法.数据库的设计范式是数据库设计所需要满足的规范.只有理解数据库的设计范式,才能设计出高效率.优雅的数据库,否则可能会设计出错误的数据库. 目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF)和第五范式(5NF,还又称完美范式).满足最低要求的叫第一范式,简称1NF.在第一范式基础上进一步满足一些要求的为

MySQL中数据中设计中的范式与反范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.但是有些时候一昧的追求范式减少冗余,反而会降低数据读写的效率,这个时候就要反范式,利用空间来换时间. 目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF)和第五范式(5NF,又称完美范式).满足最低要求的范式是第一范式(1NF).在第一范式的基础上进一步满足更多规范要求的称

关系数据库涉及中的范式与反范式

数据中设计中的范式与反范式 解释一下关系数据库的第一第二第三范式?