巴科斯范式

来源:互联网 发布:淘宝可以办假的身份证 编辑:程序博客网 时间:2024/04/30 09:41
 

巴科斯范式(也称为巴科斯-瑙尔范式巴克斯-诺尔范式)是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。尽管巴科斯范式也能表示一部分自然语言的语法,它还是更广泛地使用于程序设计语言、命令集、通信协议的语法表示中。大多数程序设计语言或者形式语义方面的教科书都采用巴科斯范式。在各种文献中还存在巴科斯范式的一些变体,如扩展巴科斯范式或者参数化的巴科斯范式。de:Backus-Naur-Form en:Backus-Naur form fr:Forme de Backus-Naur ja:BNF记法 nl:Backus-Naur-formalisme pl:Notacja BNF tr:Backus-Naur form

什么是巴科斯范式?  
      
  巴科斯范式(BNF:  Backus-Naur  Form  的缩写)是由  John  Backus  和  Peter  Naur  首先引入的用来描述计算机语言语法的符号集。
  现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。        
            
          巴科斯范式的内容    
    

在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。  
在双引号外的字(有可能有下划线)代表着语法部分。  
尖括号(  <  >  )内包含的为必选项。  
方括号(  [  ]  )内包含的为可选项。  
大括号(  {  }  )内包含的为可重复0至无数次的项。  
竖线(  |  )表示在其左右两边任选一项,相当于"OR"的意思。  
::=  是“被定义为”的意思。  
      
            
          巴科斯范式示例    
    

这是用BNF来定义的Java语言中的For语句的实例:  
for_statement  
            ::=  
            "for"  "("  (  variable_declaration  |  
    (  expression  ";"  )  |  ";"  )  
            [  expression  ]  ";"  
            [  expression  ]  ";"  
            ")"  statement  

  

        这是Oracle  packages的BNF定义:
package_body  ::=  "package"  package_name  "is"  
package_obj_body  {  package_obj_body  }  
[  "begin"  seq_of_statements  ]  
"end"  [  package_name  ]  ";"  

package_obj_body  ::=  variable_declaration  
|  subtype_declaration  
|  cursor_declaration  
|  cursor_body  
|  exception_declaration  
|  record_declaration  
|  plsql_table_declaration  
|  procedure_body  
|  function_body

procedure_body  ::=  "procedure"  procedure_name  
[  "("  argument  {  ","  argument  }  ")"  ]  
"return"  return_type  
"is"  
[  "declare"  declare_spec  ";"  {  declare_spec  ";"  }  ]  
"begin"  
seq_of_statements  
[  "exception"  exception_handler  {  exception_handler  }  ]  
"end"  [  procedure_name  ]  ";"  

statement  ::=  comment  
|  assignment_statement  
|  exit_statement  
|  goto_statement  
|  if_statement  
|  loop_statement  
|  null_statement  
|  raise_statement  
|  return_statement  
|  sql_statement  
|  plsql_block  

  

        这是用BNF来定义的BNF本身的例子:

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  }  """

      
            
          扩展的巴科斯范式  Augmented  BNF    
    
  RFC2234  定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进,比如说,在ABNF中,尖括号不再需要。
原创粉丝点击