BNF 介绍

BNF 介绍转 来自维基百科 BNF 规定是推导规则 产生式 的集合 写为 这里的符号是非终结符 而表达式由一个符号序列 或用指示选择的竖杠 分隔的多个符号序列构成 每个符号序列整体都是左端的符号的一种可能的替代 从未在左端出现的符号叫做终结符 基本原理 nbsp nbsp nbsp nbsp nbsp BNF 类似一种数学游戏 从一个符号开始 叫做起始标志 实例中常用 S 表示 然后给出替换

 

转:来自维基百科

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 = on















































































































































e of 0 1 2 3 4 5 6 7 8 9 
  这里非终结符digit用斜体表示,on

e of是这种方法里定义的一个量词(常用斜黑体)。




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221930.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:57
下一篇 2026年3月17日 下午4:58


相关推荐

  • 监控神器普罗米修斯Prometheus安装配置「建议收藏」

    监控神器普罗米修斯Prometheus安装配置「建议收藏」一、基础环境环境/组件版本下载地址操作系统CentOS7.3http://archive.kernel.org/centos-vault/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.isoPrometheus2.6.0https://prometheus.io/download/#prometheusgo…

    2022年6月9日
    164
  • 如何查看windows的CUDA版本「建议收藏」

    如何查看windows的CUDA版本「建议收藏」最近开始学习一些关于图像处理的计算机视觉的问题(跟着老师,开拓视野)首先就是安装anaconda环境(这个简单)然后老师要求使用pytorch作为我们学习的工具,于是上官网查看相应的pytorch的版本:只需要我们自己选择相应的系统,下载使用的工具方式,python的版本,以及CUDA版本号,就可以获得到相应的命令进行下载安装。这时遇到一个问题,CUDA是什么?CUDA(C…

    2022年6月14日
    170
  • Linux 小知识翻译 – 「/proc 文件夹」

    Linux 小知识翻译 – 「/proc 文件夹」

    2021年8月30日
    74
  • C++能做什么[通俗易懂]

    C++能做什么[通俗易懂]C++Applications2011年6月18日更新这里有一个有关系统、应用程序和库的列表,列表中的全部或者大部分代码用C++编写,当然,该列表并不全面。即使我如何努力,我也不能列举一个含有1000个主要由C++编写的程序列表,但是这里的列表可能包含我听说过程序之中的第1000个。这是一个包括系统、应用程序和库的列表,读者可能熟悉其中的一些,新手可能有个概念C++能做什么,或者我仅仅

    2022年5月9日
    56
  • VSCode中高效接入DeepSeek的完整指南

    VSCode中高效接入DeepSeek的完整指南

    2026年3月16日
    3
  • bowtie和bowtie2用法详解

    bowtie和bowtie2用法详解bowtie 短序列比对工具详解常见的短序列比对工具有很多 如 fasta blast bowtie shrimp soap 等 每个工具都有其自身的优点 但同时也具备了一些缺点 权衡利弊 我选择 bowtie 作为主要的短序列比对工具 它速度很快 比对结果也容易理解 现在举个例子来探讨 bowtie 的使用方法 现在有 GENOME fa 高通量测序数据 Reads fa 我们希望将 Reads fa 比对到

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号