加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]巴科斯-诺尔(BNF范式)范式

(2018-11-12 14:36:44)
标签:

转载

www:   http://hi.baidu.com/lrpaevvepnbaelq/item/9060029141427bd81b49df9e

巴科斯范式是一种用形式化符号精确描述程序设计语言的语法的一种形式系统。又称巴科斯-诺尔形式,简称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均可转化为语法图

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有