﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小草的天空-文章分类-程序员知识</title><link>http://www.blogjava.net/xiaofei-suman/category/50950.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 27 Feb 2012 09:09:40 GMT</lastBuildDate><pubDate>Mon, 27 Feb 2012 09:09:40 GMT</pubDate><ttl>60</ttl><item><title>巴科斯范式BNF</title><link>http://www.blogjava.net/xiaofei-suman/articles/370827.html</link><dc:creator>齐纳尔多</dc:creator><author>齐纳尔多</author><pubDate>Mon, 27 Feb 2012 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/xiaofei-suman/articles/370827.html</guid><wfw:comment>http://www.blogjava.net/xiaofei-suman/comments/370827.html</wfw:comment><comments>http://www.blogjava.net/xiaofei-suman/articles/370827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaofei-suman/comments/commentRss/370827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaofei-suman/services/trackbacks/370827.html</trackback:ping><description><![CDATA[<h1 class="title">BNF</h1><script type="text/javascript">/*<![CDATA[*/var hash="window.location.hash.match(/^#sub(\d+)/);bk.view.hash=hash&&hash[1];hash=null;bk.view.expFlag=false;baikeViewInfo={id:"1137652",editable:"true",title:"BNF",expIndex:"0",subLen:"1",isMulit:false};/*]]">*/</script>
<div class="clear"></div>
<div id="lemmaContent-0" class="lemma-main-content">　　<a href="http://baike.baidu.com/view/807721.htm" target="_blank"><font color="#136ec2">巴科斯范式</font></a>及其扩展 
<div class="spctrl"></div>　　BNF &amp; Augmented BNF 
<div class="spctrl"></div>　　什么是巴科斯范式？ 
<div class="spctrl"></div>　　巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法（最早用于描述ALGOL 60 编程语言）。确切地说，早在UNESCO（<a href="http://baike.baidu.com/view/10718.htm" target="_blank"><font color="#136ec2">联合国教科文组织</font></a>）关于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建议的）。 
<div class="spctrl"></div>　　现在，几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。 
<div class="spctrl"></div>　　----------------------------------------------------------------------------- 
<div class="spctrl"></div>　　巴科斯范式的内容 
<div class="spctrl"></div>　　在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。 
<div class="spctrl"></div>　　在双引号外的字（有可能有下划线）代表着语法部分。 
<div class="spctrl"></div>　　尖括号( &lt; &gt; )内包含的为必选项。 
<div class="spctrl"></div>　　方括号( [ ] )内包含的为可选项。 
<div class="spctrl"></div>　　大括号( { } )内包含的为可重复0至无数次的项。 
<div class="spctrl"></div>　　竖线( | )表示在其左右两边任选一项，相当于"OR"的意思。 
<div class="spctrl"></div>　　::= 是&#8220;被定义为&#8221;的意思。 
<div class="spctrl"></div>　　巴科斯范式示例 
<div class="spctrl"></div>　　这是用BNF来定义的<a href="http://baike.baidu.com/view/229611.htm" target="_blank"><font color="#136ec2">Java语言</font></a>中的For语句的实例： 
<div class="spctrl"></div>　　FOR_STATEMENT ::= 
<div class="spctrl"></div>　　"for" "(" ( variable_declaration | 
<div class="spctrl"></div>　　( expression ";" ) | ";" ) 
<div class="spctrl"></div>　　[ expression ] ";" 
<div class="spctrl"></div>　　[ expression ] 
<div class="spctrl"></div>　　")" statement 
<div class="spctrl"></div>　　这是Oracle packages的BNF定义： 
<div class="spctrl"></div>　　package_body ::= "package" package_name "is" 
<div class="spctrl"></div>　　package_obj_body 
<div class="spctrl"></div>　　[ "begin" seq_of_statements ] 
<div class="spctrl"></div>　　"end" [ package_name ] ";" 
<div class="spctrl"></div>　　package_obj_body ::= variable_declaration 
<div class="spctrl"></div>　　| subtype_declaration 
<div class="spctrl"></div>　　| cursor_declaration 
<div class="spctrl"></div>　　| cursor_body 
<div class="spctrl"></div>　　| exception_declaration 
<div class="spctrl"></div>　　| record_declaration 
<div class="spctrl"></div>　　| plsql_table_declaration 
<div class="spctrl"></div>　　| procedure_body 
<div class="spctrl"></div>　　| function_body 
<div class="spctrl"></div>　　procedure_body ::= "procedure" procedure_name 
<div class="spctrl"></div>　　[ "(" argument { "," argument } ")" ] 
<div class="spctrl"></div>　　"return" return_type 
<div class="spctrl"></div>　　"is" 
<div class="spctrl"></div>　　[ "declare" declare_spec ";" { declare_spec ";" } ] 
<div class="spctrl"></div>　　"begin" 
<div class="spctrl"></div>　　seq_of_statements 
<div class="spctrl"></div>　　[ "exception" exception_handler ] 
<div class="spctrl"></div>　　"end" [ procedure_name ] ";" 
<div class="spctrl"></div>　　statement ::= comment 
<div class="spctrl"></div>　　| assignment_statement 
<div class="spctrl"></div>　　| exit_statement 
<div class="spctrl"></div>　　| goto_statement 
<div class="spctrl"></div>　　| if_statement 
<div class="spctrl"></div>　　| loop_statement 
<div class="spctrl"></div>　　| null_statement 
<div class="spctrl"></div>　　| raise_statement 
<div class="spctrl"></div>　　| return_statement 
<div class="spctrl"></div>　　| sql_statement 
<div class="spctrl"></div>　　| plsql_block 
<div class="spctrl"></div>　　这是用BNF来定义的BNF本身的例子： 
<div class="spctrl"></div>　　syntax ::= 
<div class="spctrl"></div>　　rule ::= identifier "::=" expression 
<div class="spctrl"></div>　　expression ::= term { "|" term } 
<div class="spctrl"></div>　　term ::= factor 
<div class="spctrl"></div>　　factor ::= identifier | 
<div class="spctrl"></div>　　quoted_symbol | 
<div class="spctrl"></div>　　"(" expression ")" | 
<div class="spctrl"></div>　　"[" expression "]" | 
<div class="spctrl"></div>　　"{" expression "}" 
<div class="spctrl"></div>　　identifier ::= letter { letter | digit } 
<div class="spctrl"></div>　　quoted_symbol ::= """ """ 
<div class="spctrl"></div>　　扩展的巴科斯范式 Augmented BNF 
<div class="spctrl"></div>　　RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进，比如说，在ABNF中，尖括号不再需要。 </div> <img src ="http://www.blogjava.net/xiaofei-suman/aggbug/370827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaofei-suman/" target="_blank">齐纳尔多</a> 2012-02-27 11:11 <a href="http://www.blogjava.net/xiaofei-suman/articles/370827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>