`

BNF 介绍

 
阅读更多
http://blog.csdn.net/bravegogo/article/details/54406471


转:来自维基百科
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是这种方法里定义的一个量词(常用斜黑体)。
分享到:
评论

相关推荐

    SQL-92标准 中文翻译——定义、记号和约定 (约定)

    BNF介绍 - **Backus-Naur Form**(BNF)是一种描述形式语言的元语言,主要用于定义上下文无关语法。 - 在SQL-92标准中,BNF被用来定义SQL语句的各种结构和语法规则。 #### 2. BNF符号解释 - `&lt; &gt;`:用于表示非...

    C语言BNF语法的图形化展示

    文档由多个章节组成,每个章节分别介绍了不同类型的C语言语法元素,如声明、表达式、语句等。 #### 2. 语法元素详解 ##### 2.1 声明 (Declarations) - **声明规范 (Declaration Specifier)** - 包括存储类规范符...

    正则表达式文法(BNF)

    本文档详细介绍了正则表达式的BNF文法,覆盖了从简单的字符匹配到复杂的串联、并集等操作。通过这些规则,开发者可以更好地理解和设计自己的正则表达式模式,以满足不同的文本处理需求。此外,对于那些想要深入研究...

    Augmented BNF for Syntax Specifications: ABNF

    ### Augmented BNF for Syntax Specifications: ABNF #### 1. 引言 ...通过以上详细介绍,我们可以看到ABNF在互联网标准和技术规范中的应用价值,以及它是如何成为一个广泛接受的标准语法表示法的。

    ABNF、BNF 文法规范和开发指南

    4. **错误处理**: 介绍如何处理不符合文法的输入,以及如何构建健壮的解析机制。 5. **兼容性问题**: 讨论与传统BNF的区别和兼容性问题,特别是对于有BNF背景的开发者来说。 6. **扩展和变体**: 描述ABNF与其他扩展...

    lisp语言的特点及其文法的bnf描述

    本文首先概述了LISP语言的主要特点,随后详细介绍了Scheme语言文法的BNF(Backus-Naur Form)描述,旨在为LISP语言的编译实现提供参考。 #### LISP语言的特点 1. **主要数据结构是表**:LISP中的数据结构以表...

    Python库 | isbnlib_bnf-1.0.3-py2.py3-none-any.whl

    ### ISBNlib_bnf库介绍 **ISBNlib_bnf** 是Python的一个开源库,它提供了一系列工具,帮助开发者验证、转换和操作与法国国家图书馆(BNF)相关的ISBN编码。BNF是法国的国家级图书馆,负责分配和管理法国出版物的...

    csharp-grammar:C#6.0的BNF语法

    本篇将详细介绍C#6.0的BNF(巴科斯范式)语法,这是描述编程语言语法的一种形式化方法。 首先,我们要理解BNF的基本概念。BNF(巴科斯范式)是一种元符号表示法,用于定义语法规则。在C#6.0中,BNF语法帮助我们...

    RFC2234(SIP遵循的BNF范式)

    ### RFC2234(SIP遵循的BNF范式) #### 语法规范的扩展巴科斯范式:ABNF **ABNF(Augmented BNF for Syntax Specifications: ABNF)** 是一种基于传统巴科斯范式的扩展版本,用于描述语法规范。与原始的巴科斯范式...

    optical2bnf.rar_文件格式_Others_

    5. **软件应用**:介绍支持光学2BNF的软件工具,如光学设计软件,以及如何在这些软件中应用光学2BNF。 6. **实验实践**:指导如何将光学2BNF应用于实验室环境,包括实验设置、数据记录和结果分析。 7. **常见问题...

    科大讯飞ABNF文法规范

    通过对科大讯飞ABNF文法规范的详细介绍,我们可以了解到这一规范不仅提供了详细的文法规则定义方法,而且还针对实际应用场景提供了实用的指导和建议。这有助于开发者更高效地构建符合要求的文法模型,进而提高语音...

    c# 5.0语法介绍

    本篇将深入探讨C# 5.0的核心语法特点,并结合产生式(BNF)来进一步阐述其语法规则。 一、异步编程 C# 5.0最大的亮点就是引入了异步编程模型,主要通过`async`和`await`关键字实现。`async`修饰符标记的方法可以...

    编译毕业设计PPT概括介绍

    在C-语言中,BNF描述了各种语句和表达式的形式,如程序、语句序列、赋值语句、if-else语句、while语句等。 - **下推自动机(PDA)模型**:在语法分析阶段,学生需要设计PDA来实现上下文无关文法的解析,将词法分析...

    bb4-predprey-1.1.2.zip

    4. **文档**:可能包含README.md或其他形式的文档,提供项目介绍、使用方法和开发指南。 5. **示例**:项目可能包含示例BNF文法和如何使用BNFParserJava解析的示例代码,帮助用户快速上手。 对于想要深入了解...

    利用LEX和YACC实现对SQL查询语句的语法分析.pdf

    本文将介绍LEX和YACC的基本工作原理,并具体阐述如何利用这两个工具来实现SQL查询语句的语法分析,并生成语法分析树。 首先,LEX(词法分析器生成器)是一个根据正规式和确定有限状态自动机原理(DFA)的词法分析...

    yufafenxi.rar_语法分析器

    这篇文档将详细介绍语法分析器的基本概念、工作原理以及C语言实现的关键点。 语法分析器,通常称为解析器,是编译器设计中的重要部分。它负责根据语言的语法规则对词法分析器产生的词法单元流进行解析,生成抽象...

Global site tag (gtag.js) - Google Analytics