<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>随网之舞EBNF</title>
	<atom:link href="http://dancewithnet.com/tag/ebnf/feed/" rel="self" type="application/rss+xml" />
	<link>http://dancewithnet.com</link>
	<description>WEB Design{HTML:CSS:Javascript:DOM:AJAX:PHP:Usability}/Viewpoint/Photo/Food/Mood</description>
	<lastBuildDate>Mon, 18 Jul 2011 02:45:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>语法图</title>
		<link>http://dancewithnet.com/2008/05/28/syntax-diagrams/</link>
		<comments>http://dancewithnet.com/2008/05/28/syntax-diagrams/#comments</comments>
		<pubDate>Wed, 28 May 2008 15:45:13 +0000</pubDate>
		<dc:creator>秦歌</dc:creator>
				<category><![CDATA[web2.0 & so on]]></category>
		<category><![CDATA[BNF]]></category>
		<category><![CDATA[EBNF]]></category>
		<category><![CDATA[巴科斯范式]]></category>
		<category><![CDATA[语法]]></category>
		<category><![CDATA[语法图]]></category>
		<category><![CDATA[铁路图]]></category>

		<guid isPermaLink="false">http://dancewithnet.com/?p=1302</guid>
		<description><![CDATA[语法图（Syntax diagrams ）又叫铁路图（railroad diagrams）是描述形式文法的一种方式。它是巴科斯范式或扩展巴科斯范式的图形化表示。最早使用语法图的书包括Niklaus Wirth写的&#8220;Pascal User Manual&#8... ]]></description>
			<content:encoded><![CDATA[<p>语法图（Syntax diagrams ）又叫铁路图（railroad diagrams）是描述<a href="http://zh.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E6%96%87%E6%B3%95">形式文法</a>的一种方式。它是<a href="http://dancewithnet.com/2008/05/17/bnf-and-ebnf/">巴科斯范式或扩展巴科斯范式</a>的图形化表示。最早使用语法图的书包括Niklaus Wirth写的<a href="http://www.standardpascal.org/The_Programming_Language_Pascal_1973.pdf">&#8220;Pascal User Manual&#8221;</a>（语法图开始于47页）和<a href="http://bitsavers.org/pdf/burroughs/B6500_6700/5000318_B6700_CANDE_Oct72.pdf">the Burroughs CANDE manual</a>。在编译领域，像BNF和它的变体这样的文字式表示法都是首选的。BNF能很好的被编译器作者和编译器理解，但是不能很好的被这些语言的大部分用户理解。铁路图能更容易被大多数人理解。数据交换格式<a href="http://zh.wikipedia.org/wiki/JSON">JSON</a>之所以流行的部分原因就是它用铁路图来表示。<span id="more-1302"></span></p>
<h3>准则</h3>
<p>一个语法的表示法是由一套语法图组成。每个图定义了一个非终结符。有一个主图通过下面方式定义了这门语言：属于这门语言的每句话都必须在主图上描绘一个路径。</p>
<p>每个图都有一个起始点和一个终点。这个图通过穿过其他的非终结符和终结符描绘了这些两点之间的可能路径。终结符用圆形区域表示，同时非终结符用方形区域表示。</p>
<h3>例子</h3>
<p>我们用一个算术表达式作为一个例子。首先我们提供一段简单的BNF语法：</p>
<pre><code>&lt;expression&gt;::= &lt;term&gt; | &lt;term&gt; &quot;+&quot; &lt;expression&gt;
&lt;term&gt;::= &lt;factor&gt; | &lt;factor&gt; &quot;*&quot; &lt;term&gt;
&lt;factor&gt;::= &lt;constant&gt; | &lt;variable&gt; | &quot;(&quot; &lt;expression&gt; &quot;)&quot;
&lt;variable&gt;::= &quot;x&quot; | &quot;y&quot; | &quot;z&quot;
&lt;constant&gt;::= &lt;digit&gt; | &lt;digit&gt; &lt;constant&gt;
&lt;digit&gt;::= &quot;0&quot; | &quot;1&quot; | &quot;2&quot; | &quot;3&quot; | &quot;4&quot; | &quot;5&quot; | &quot;6&quot; | &quot;7&quot; | &quot;8&quot; | &quot;9&quot;</code></pre>
<p>这段语法也能在EBNF中被表示：</p>
<pre><code>expression = term , {"+" term};
term = factor , {"*" factor};
factor = constant | variable | "(" , expression , ")";
variable = "x" | "y" | "z";
constant = digit , {digit};
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
</code></pre>
<p>关于这段语法的一组可能的语法图：<img src="http://dancewithnet.com/wp-content/uploads/2008/05/syntax-diagrams.png" alt="" title="syntax-diagrams" width="500" height="573" class="alignnone size-full wp-image-1303" /></p>
<h3>扩展链接</h3>
<ol>
<li><a href="http://dancewithnet.com/2008/05/17/bnf-and-ebnf/">巴科斯范式和扩展巴科斯范式</a></li>
<li><a href="http://www.json.org/json-zh.html">JSON website including syntax diagrams</a></li>
<li> <a href="http://www-cgi.uni-regensburg.de:80/~brf09510/syntax.html">Automatic generator of syntax diagrams</a></li>
<li><a href="http://www-cgi.uni-regensburg.de:80/~brf09510/syntax/lazyebnf.ebnf.html">Syntax diagrams of BNF</a></li>
<li><a href="http://dotnet.jku.at/applications/Visualizer/">Generator from EBNF</a></li>
<li><a href="http://www.informatik.uni-freiburg.de:80/~thiemann/haskell/ebnf2ps/">From EBNF to a postscript file wit the diagrams</a></li>
</ol>
<p>原文：<a href="http://en.wikipedia.org/wiki/Syntax_diagram">Syntax diagram</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dancewithnet.com/2008/05/28/syntax-diagrams/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>巴科斯范式和扩展巴科斯范式</title>
		<link>http://dancewithnet.com/2008/05/17/bnf-and-ebnf/</link>
		<comments>http://dancewithnet.com/2008/05/17/bnf-and-ebnf/#comments</comments>
		<pubDate>Sat, 17 May 2008 10:17:54 +0000</pubDate>
		<dc:creator>秦歌</dc:creator>
				<category><![CDATA[web2.0 & so on]]></category>
		<category><![CDATA[BNF]]></category>
		<category><![CDATA[EBNF]]></category>
		<category><![CDATA[巴科斯范式]]></category>
		<category><![CDATA[语法]]></category>

		<guid isPermaLink="false">http://dancewithnet.com/?p=1301</guid>
		<description><![CDATA[巴科斯范式
巴科斯范式（也称为巴科斯-瑙尔范式、巴克斯-诺尔范式）即 BNF 是一种用于表示上下文无关文法的语言，上下文无关文法描述了一类形式语言。尽管巴科斯范式也能表示一部分自然... ]]></description>
			<content:encoded><![CDATA[<h3>巴科斯范式</h3>
<p>巴科斯范式（也称为巴科斯-瑙尔范式、巴克斯-诺尔范式）即 BNF 是一种用于表示上下文无关文法的语言，上下文无关文法描述了一类形式语言。尽管巴科斯范式也能表示一部分自然语言的语法，它还是更广泛地使用于程序设计语言、指令集、通信协议的语法表示中。大多数程序设计语言或者形式语义方面的教科书都采用巴科斯范式。在各种文献中还存在巴科斯范式的一些变体，如<a href="http://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F">扩展巴科斯范式EBNF</a>或<a href="http://zh.wikipedia.org/wiki/%E6%89%A9%E5%85%85%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F">扩充巴科斯范式 ABNF</a><span id="more-1301"></span>。</p>
<p>BNF 规定是推导规则(产生式)的集合,写为：</p>
<pre><code>&lt;code&gt;&lt;符号&gt; ::= &lt;使用符号的表达式&gt;</code></pre>
<p>这里的&lt;符号&gt; 是非终结符，而表达式由一个符号序列，或用指示选择的竖杠 &#8216;|&#8217; 分隔的多个符号序列构成，每个符号序列整体都是左端的符号的一种可能的替代。从未在左端出现的符号叫做终结符。</p>
<h3>扩展巴科斯范式</h3>
<p>扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。</p>
<p>它最初由尼古拉斯·沃斯开发，最常用的 EBNF 变体由标准，特别是 ISO-14977 所定义。</p>
<h4>基本</h4>
<p>代码，如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码。</p>
<p>EBNF 定义了把各符号序列分别指派到非终结符的产生规则:</p>
<pre><code>digit excluding zero = "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;
digit = "0" | digit excluding zero ;</code></pre>
<p>这个产生规则定义了在这个指派的左端的非终结符 digit。竖杠表示可供选择，而终结符被引号包围，最后跟着分号作为终止字符。所以 digit 是一个 0 或可以是 1 或 2 或 3 直到 9 的一个 digit excluding zero。</p>
<p>产生规则还可以包括由逗号分隔的一序列终结符或非终结符:</p>
<pre><code>twelve = "1" , "2" ;
two hundred one = "2" , "0" , "1" ;
three hundred twelve = "3" , twelve ;
twelve thousand two hundred one = twelve , two hundred one ;</code></pre>
<p>可以省略或重复的表达式可以通过花括号 { &#8230; } 表示:</p>
<pre><code>natural number = digit excluding zero , { digit } ;</code></pre>
<p>在这种情况下，字符串 1, 2, &#8230;,10,&#8230;,12345,&#8230; 都是正确的表达式。要表示这种情况，于花括号内设立的所有东西可以重复任何次，包括根本不出现。</p>
<p>可选项可以通过方括号 [ ... ] 表示:</p>
<pre><code>integer = "0" | [ "-" ] , natural number ;</code></pre>
<p>所以 integer 是一个零(0)或可能前导可选的负号的一个自然数。</p>
<p>EBNF 还包括描述指定次数的重复，和排除产生式的某部分或向 EBNF 文法插入注释的语法。</p>
<h4>依据 ISO 的扩展</h4>
<p>依据 ISO 14977 标准，提供了两个设施来扩展 EBNF。其一是在 EBNF 文法部分的特殊序列，它是在问号包围内的任意文本，其解释超出了 EBNF 标准的范围。例如，空格字符可以用如下规则定义:</p>
<pre><code>space = ? US-ASCII character 32 ?;</code></pre>
<p>其二利用圆括号在 EBNF 中不能放置到紧随标识符之后的事实。下列不是有效的 EBNF:</p>
<pre><code>something = foo ( bar );</code></pre>
<p>所以 EBNF 的扩展可以使用这种表示法。例如，在 Lisp 文法中，函数应用可以用如下规则定义:</p>
<pre><code>function application = list( symbol , [ { expression } ] );</code></pre>
<h4>扩展 BNF 的动机</h4>
<p>BNF 有着可选项和重复不能直接表达的问题。作为替代，它们需要利用中介规则或两选一规则，对于可选项，定义要么是空的要么是可选的产生式的规则，对于重复，递归的定义要么是被重复的产生式要么是自身的规则。同样的构造仍可用在 EBNF 中。</p>
<p>可选项:</p>
<pre><code>signed number = [ sign , ] number ;</code></pre>
<p>可按 BNF-风格定义为:</p>
<pre><code>signed number = sign , number | number ;</code></pre>
<p>或</p>
<pre><code>signed number = optional sign , number ;
optional sign = ε | sign ; (* 使用 ε 来更清晰的指示空产生式 *)</code></pre>
<p>重复:</p>
<pre><code>number = { digit } ;</code></pre>
<p>可按 BNF-风格定义为:</p>
<pre><code>number = digit | number digit;</code></pre>
<h4>其他增加和修改</h4>
<p>EBNF 排除了 BNF 的一些缺陷:</p>
<ol>
<li>BNF 为自身使用了符号 (&lt;, &gt;, |, ::=)。当它们出现在要定义的语言中的时候，BNF 不能不加以修改或解释的使用。</li>
<li>BNF-语法在一行中只表示一个规则。</li>
</ol>
<p>EBNF 解决了这些问题:</p>
<ol>
<li>终结符被严格的包围在引号 (&#8220;&#8230;&#8221; 或 &#8216;&#8230;&#8217;) 中。给非终结符的尖括号 (&#8220;&lt;&#8230;&gt;&#8221;)可以省略。</li>
<li>通常使用终止字符分号结束一个规则。</li>
</ol>
<p>进一步还提供了定义重复次数，排除法选择(比如除了引号的所有字符)和注释等的增强机制。</p>
<p>不管所有这些增强，EBNF 在能定义的语言的意义上不比 BNF 更强大。在原理上用 EBNF 定义的任何文法都可以用 BNF 表达。但是经常导致可观的更多规则的表示。</p>
<p>EBNF 已经被ISO用代码 ISO/IEC 14977:1996(E) 标准化了。</p>
<p>在某些场合任何扩展的 BNF 都被称为 EBNF。例如 W3C 使用 <a href="http://www.w3c.org/TR/REC-xml#sec-notation">one EBNF</a> 来规定 XML。</p>
<h4>另一个例子</h4>
<p>只允许赋值的简单编程语言可以用 EBNF 定义为:</p>
<pre><code>(* a simple program in EBNF − Wikipedia *)
program = 'PROGRAM' , white space , identifier , white space ,
           'BEGIN' , white space ,
           { assignment , ";" , white space } ,
           'END.' ;
identifier = alphabetic character , [ { alphabetic character | digit } ] ;
number = [ "-" ] , digit , [ { digit } ] ;
string = '"' , { all characters − '"' } , '"' ;
assignment = identifier , ":=" , ( number | identifier | string ) ;
alphabetic character = "A"|"B"|"C"|"D"|"E"|"F"|"G"
             |"H"|"I"|"J"|"K"|"L"|"M"|"N"
             |"O"|"P"|"Q"|"R"|"S"|"T"|"U"
             |"V"|"W"|"X"|"Y"|"Z" ;
digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;

white space = ? white space characters ? ;
all characters = ? all visible characters ? ;</code></pre>
<p>一个语法上正确的程序:</p>
<pre><code>PROGRAM DEMO1
BEGIN
  A0:=3;
  B:=45;
  H:=-100023;
  C:=A;
  D123:=B34A;
  BABOON:=GIRAFFE;
  TEXT:="Hello world!";
END.</code></pre>
<p>这个语言可以轻易的扩展上控制流，算术表达式和输入/输出指令。就可以开发出一个小的、可用的编程语言了。</p>
<p>使用了在标准中提议为正规表示的下列字符:</p>
<table>
<thead>
<tr>
<th>用途</th>
<th>符号表示</th>
</tr>
</thead>
<tbody>
<tr>
<td>定义</td>
<td>=</td>
</tr>
<tr>
<td>串接</td>
<td>,</td>
</tr>
<tr>
<td>终止</td>
<td>;</td>
</tr>
<tr>
<td>分隔</td>
<td>|</td>
</tr>
<tr>
<td>可选</td>
<td>	[ ... ]</td>
</tr>
<tr>
<td>重复</td>
<td>{ &#8230; }</td>
</tr>
<tr>
<td>分组</td>
<td>	( &#8230; )</td>
</tr>
<tr>
<td>双引号</td>
<td>&#8221; &#8230; &#8220;</td>
</tr>
<tr>
<td>单引号</td>
<td>&#8216; &#8230; &#8216;</td>
</tr>
<tr>
<td>注释</td>
<td>	(* &#8230; *)</td>
</tr>
<tr>
<td>特殊序列</td>
<td>? &#8230; ?</td>
</tr>
<tr>
<td>除外</td>
<td>-</td>
</tr>
</tbody>
</table>
<h4>约定</h4>
<ol>
<li>使用了如下约定:
<ol>
<li>扩展 BNF 每个元标识符都被写为用连字号连接起来的一个或多个字；</li>
<li>结束于“-symbol” 的元标识符是扩展 BNF 的终结符的名字。</li>
</ol>
</li>
<li>表示扩展 BNF 的每个操作符的正常字符和它所蕴涵的优先级(顶部为最高优先级)为:
<pre><code>* repetition-symbol
- except-symbol
, concatenate-symbol
| definition-separator-symbol
= defining-symbol
; terminator-symbol</code></pre>
</li>
<li>下列括号对超越正常优先级:
<pre><code>'  first-quote-symbol            first-quote-symbol  '
"  second-quote-symbol          second-quote-symbol  "
(* start-comment-symbol          end-comment-symbol *)
(  start-group-symbol              end-group-symbol  )
[  start-option-symbol            end-option-symbol  ]
{  start-repeat-symbol            end-repeat-symbol  }
?  special-sequence-symbol   special-sequence-symbol ?</code></pre>
</li>
</ol>
<p>作为例子，下列语法规则展示了表达重复的设施:</p>
<pre><code>aa = "A";
bb = 3 * aa, "B";
cc = 3 * [aa], "C";
dd = {aa}, "D";
ee = aa, {aa}, "E";
ff = 3 * aa, 3 * [aa], "F";
gg = {3 * aa}, "D";</code></pre>
<p>这些规则定义的终结字符串如下:</p>
<pre><code>aa: A
bb: AAAB
cc: C AC AAC AAAC
dd: D AD AAD AAAD AAAAD etc.
ee: AE AAE AAAE AAAAE AAAAAE etc.
ff: AAAF AAAAF AAAAAF AAAAAAF
gg: D AAAD AAAAAAD etc.</code></pre>
<h4>有关工作</h4>
<ol>
<li>W3C 使用一种<a href="http://www.w3c.org/TR/REC-xml#sec-notation">不同的 EBNF </a>来指定 XML 语法。</li>
<li>British Standards Institute 在1981年出版了一个 EBNF 标准: BS 6154。</li>
<li>IETF 使用在<a href="http://tools.ietf.org/html/rfc4234"> RFC 4234</a> 中规定的<a href="http://zh.wikipedia.org/wiki/%E6%89%A9%E5%85%85%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F">扩充 BNF (ABNF)</a>。</li>
</ol>
<p>ps，由于中文维基百科尚不可访问，所以就原文转载了其中关于<a href="http://zh.wikipedia.org/wiki/%E5%B7%B4%E7%A7%91%E6%96%AF-%E7%91%99%E5%B0%94%E8%8C%83%E5%BC%8F">巴科斯范式</a>和<a href="http://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F">扩展巴科斯范式</a>的词条。</p>
<h3></h3>
]]></content:encoded>
			<wfw:commentRss>http://dancewithnet.com/2008/05/17/bnf-and-ebnf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

