巴科斯-诺尔(BNF范式)范式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值