BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 编程语言,参见[Naur60])。确切地说,早在UNESCO(联合国教科文组织)关于ALGOL 58的会议上提出的一篇报告中,Backus就引入了大部分BNF符号。虽然没有什么人读过这篇报告,但是在Peter Naur读这篇报告时,他发现Backus对ALGOL 58的解释方式和他的解释方式有一些不同之处,这使他感到很惊奇。首次设计ALGOL的所有参与者都开始发现了他的解释方式的一些弱点,所以他决定对于以后版本的ALGOL应该以一种类似的形式进行描述,以让所有参与者明白他们在对什么达成一致意见。他做了少量修改,使其几乎可以通用,在设计ALGOL 60的会议上他为ALGOL 60草拟了自己的BNF。看你如何看待是谁发明了BNF了,或者认为是Backus在1959年发明的,或者认为是Naur在1960年中发明。(关于那个时期编程语言历史的更多细节,参见1978年8月,《Communications of the ACM(美国计算机学会通讯)》,第21卷,第8期中介绍Backus获图灵奖的文章。这个注释是由来自Los Alamos Natl.实验室的William B. Clodius建议的)。

巴科斯范式是一种用形式化符号精确描述程序设计语言的语法的一种形式系统。又称巴科斯-诺尔形式,简称BNF范式。
        实际上,BNF范式等价于乔姆斯基的2型文法。它是一种典型的元语言,可以严格地表示语法规则,且描述的文法是上下文无关文法。
       程序设计语言的语法成分,如标识符、表达式、句子等,大多可以用BNF的产生规则加以描述。
BNF范式的产生规则
BNF的元符号
::=    表示“定义为 ”
|      表示“或者”
< >    尖括号用于括起类别名字
一条BNF的生成规则形如:
      ::=
说明:
1、 每个规则中只包含一个::=符号,它将规则分为左右两部分。左边 表示一个非终结符号(代表某个语法成分,通常对应有确定含义),也就是说它可以被"::="右边的部分所替换。非终结符号必须用"<"和">"括起来表示它是一个非终结符号。右边是由非终结符或 “|”与终结符组成的一个符号串,或由“|”隔开的几个这样的符号串。这里终结符指程序设计语言字符集的基本字符。
2、 由一串非终结符和以其字面意义出现在规则中终结符所组成。竖线"|"可以用在两个符号(包括终结符和非终结符)中间,表示使用"|"左边或右边的符号均可。
3、 "::="被定义的非终结符 可以出现在"::="右边的 中,表示递归定义。

例:用BNF定义一个文法
     S∷=AbS′|bS′|cS′
     S′∷=aS′|ε
     A∷=Bc|a
    B∷=Sb|b

引入扩展符号的BNF范式
有些学者为了方便使用引入了一些扩展符号:

字符

含义

[…]

可选项

{…}

重复项(可重复0或多次)

(…)

组合项

:n:n

后缀表示范围,如: :1:8,表示“用1到8个字符命名”

双引号内的字符表示这些字符本身,要表示双引号要用如下形式:” ” ”

例: 使用扩展符号定义的一个语法
syntax       ::=    { rule }
rule         ::=    identifier    "::="    expression
expression ::=    term { "|" term }
term         ::=    factor { factor }
factor       ::=    identifier |
                  quoted_symbol |
                  "("    expression    ")" |
                  "["    expression    "]" |
                  "{"    expression    "}"
identifier ::=    letter { letter | digit }
quoted_symbol ::= """ { any_character } """

ABNF
           ABNF是在BNF基础上扩展的增强型巴克斯范式,主要用于描述文本编码,平衡了压缩性和简单性,具有合理的表达能力,大多数Internet应用层标准都可用ABNF来描述.ABNF文法定义为:
    name=elements crlf
其中,“name”是规则名,“=”表示“定义为”,“elements”是一个或多个规则名或终结符,“crlf’是回车换行,表征一行的结束。
与BNF不同,ABNF中的中括号(“<”,“>”)不再需要。
ABNF有多种操作符,其中有四种基本的操作符:连接、选择、循环和可选项。

1. 连接
格式:    规则1    规则2
通过列出一系列规则名,一条规则可用于定义一个简单有序的值串--即,一连串邻接的字符。例如:        
    foo           =    %x61             ; a
             bar           =    %x62             ; b  
    mumble        =    foo bar foo
因此规则 与小写字符串"aba"匹配。

2.选择
格式: 规则1 / 规则2
由斜杠(“/”)分隔的元素是可选的。
因此,foo / bar将接受 或 。
选择又包括增式选择和值域选择两种

(1)增式选择
格式: 规则1 =/ 规则2
通过稍后的规则定义增加选择集,一个初始规则可能匹配一个或多个选择。
          oldrule       =/ additional-alternatives
如:        
ruleset       =    alt1 / alt2      
ruleset       =/ alt3    
ruleset       =/ alt4 / alt5
与以下说明相同:      
ruleset       =    alt1 / alt2 / alt3 / alt4 / alt5

(2)值域选择
格式: %c##-##
通过使用连字符(“-”)表明可选值域的方式,可以紧缩说明可选数值域。
      DIGIT         =    %x30-39
等同于:      
      DIGIT         =    "0" / "1" / "2" / "3" / "4" / "5" / "6" /"7" / "8" / "9“
连接的数值和数值域不能在同一串中说明。一个数值可以用点号连接或使用连字符说明一个值域。因此,为了在行序列结束之间说明一个可打印的字符,说明格式如下:
         char-line = %x0D.0A %x20-7E %x0D.0A
3. 循环
(1)不定循环
格式:    *Rule
在元素前的操作符“*”表示重复。完整形式为:
          *element
其中
是可选的十进制值,表示元素出现至少次,至多次。默认值是0和无穷,因此:
* 允许重复任意次,包括0
1* 需要至少1次;
3*3 只允许3次
而1*2 允许1或2次。

(2)指定循环
格式:          element
等同于          * element
即, 正好出现 次。
因而2DIGIT是一个2位数,而3ALPHA是一个3字母字符串。

4. 可选序列
格式:    [RULE]
方括号包括了一个可选元素序列:   
       [foo bar]     等同于          *1(foo bar)
即foo bar出现0次或者1次

ABNF还规定了其他一些符号:
注释       ;注释内容
分组     (Rule1 Rule2)
BNF范式的特点
1、BNF范式主要用来描述给定语言的语法规则,具有简单、清晰、明确和普适等特点
2、用BNF符号系统可以用形式化地用数学符号、逻辑符号描述程序语法,使得算法描述标准化
3、每一个BNF均可转化为语法图

原帖:http://hi.baidu.com/yshsh/blog/item/19fbbf50ad623c6384352402.html

巴科斯-诺尔(BNF范式)范式相关推荐

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

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

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

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

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

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

  4. BNF(巴科斯范式)

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Java程序员到架构师的推荐阅读书籍
  2. windows7使用vhd虚拟磁盘
  3. colab中的在Github中保存一份副本无法保存到自己github
  4. 干货!总结19个提升iOS开发技术的必看教程!
  5. SDWebImage 的简单使用方法
  6. USB 3.1 与 Type-C 接口有什么关系呢
  7. anaconda环境中使用sudo python报错
  8. 2021年高考成绩查询2,2021年高考成绩公布后几天填报志愿
  9. 在ASP.NET MVC中进行TDD开发
  10. C# 从文本列中检索数据
  11. PAT_B_1013 数素数
  12. Linux 执行 Shell脚本报错,“syntax error: unexpected end of file” 原因及处理
  13. linux用户打开进程数,Linux 用户打开进程数的调整
  14. 网页游戏开发基础——网页基础知识
  15. mysql 间隙锁 的范围_mysql间隙锁
  16. 【C#】基础篇(3) C#实现串口助手,解决中文乱码
  17. python powerbi知乎_数据分析-PowerBI
  18. 点集拓扑学的历史介绍
  19. web前端开发工程师是做什么工作的?
  20. Windows10分屏,扩展显示器2刷新率只有29Hz

热门文章

  1. 基于NRF52832的一个蓝牙门锁低功耗方案
  2. 五、mybatis缓存机制
  3. #VCS#关于 simv 可执行返回结果的释义
  4. 计算机qqT教案,It's red  教学设计
  5. 使用WORD的邮件合并和文档附件功能批量制作带照片的准考证
  6. EMS邮箱数据库全局监控设置
  7. 都能看懂的LIS(最长上升子序列)问题
  8. 真的都是黑幕么?普通学生考研还有机会逆袭么?
  9. SAP RFC介绍:关于sRFC,aRFC,tRFC,qRFC和bgRFC
  10. Android金蛇剑之Gallery之沙场秋点兵