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是这种方法里定义的一个量词(常用斜黑体)。

转载于:https://www.cnblogs.com/huiyenashen/p/4445676.html

BNF范式(巴科斯范式)简介相关推荐

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

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

  2. BNF(巴科斯范式)

    BNF 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 ...

  3. 巴科斯范式BNF: Backus-Naur Form介绍

    巴科斯范式(BNF: Backus-Naur Form. 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 编程 ...

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

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

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

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

  6. CS【1】:巴科斯范式(BNF: Backus-Naur Form)介绍与例子

    太幸运了,今天考试刚刚考到,把笔记放出来哦 有时间更新一下原题 巴科斯范式 (BNF: Backus-Naur Form 的缩写)描述计算机语言语法的符号集 在双引号中的字("word&qu ...

  7. 巴科斯范式(Backus-Naur Form, BNF)

    什么是巴科斯范式(Backus-Naur Form, BNF) 描述语言的语法规则 游戏规则 在双引号中的东西代表它本身 双引号外的字代表语法 <必选项> [可选项] {0次或多次} | ...

  8. BNF范式(巴科斯范式)

    BNF范式(巴科斯范式) 是一种用递归的思想来表述计算机语言符号集的定义规范. 基本结构: <non-terminal> ::= <replacement> non-termi ...

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

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

  10. 巴科斯范式(BNR范式,Backus-Naur Form)

    前言: 当你搜索看到这篇文章时,我想你已经有了 动机来了解什么是巴科斯范式(BNR范式,Backus-Naur Form).对于本人而言,我是因为需要看一门编程语言的IEEE标准文档而需要了解BNR范 ...

最新文章

  1. Locust学习总结分享
  2. BatchNorm中forward未被调用原因
  3. odoo10参考系列--ORM API 一(记录集、环境、通用方法和创建模型)
  4. mysql增加sort_buffer_MySQL数据库之MySQL中的sort_buffer_size参数大小的设置问题
  5. 条款6:明确拒绝编译器自动生成的函数
  6. 【Python】AttributeError: 'Series' object has no attribute 'order'
  7. 多视几何_计算两幅图像之间的基础矩阵F和一副图像上的点在另一福图像上的极线L
  8. setInterval.js
  9. PDMS Pipeline Tool 教程(二):通用功能
  10. 2009-2021计算机408统考真题及解析分享
  11. Zabbix监控网站
  12. [OCCT] Open CASCADE Technology的编译(包含示例的编译)
  13. 【仙剑奇侠传5】主线任务汇总
  14. 物联网案例(二):物联网系统如何进行实时决策
  15. yarn logs 查看日志
  16. NP-Hard问题--世界七大数学难题之首
  17. 重磅,2020广播电视科技创新奖揭晓
  18. 当BERT遇上搜索引擎
  19. 路由虚拟端口配置dhcp服务器,h3c 路由器 设置dhcp服务器配置
  20. Servlet是什么?

热门文章

  1. Google-Analytics 学习与思考
  2. sqlserver存储过程sp_send_dbmail邮件(html)实际应用
  3. Head first java chapter 6 认识java API
  4. TWaver版3D化学元素周期表
  5. js 获取 eWebEditor 的内容
  6. AngularJs学习之ng-repeat-start,ng-repeat-end 指令
  7. Linux常用命令——paste
  8. Java EE(五)
  9. Attribute class invalid for tag present according to TLD
  10. IBM 推出 Bluemix :Swift 将支持服务器端开发