[16] [DFN@en[BNF]] は、[[文脈自由文法]]の記述書式の一種です。
[[BNF]] とその変種は非常によく用いられています。多くの場合、
「[[BNF]]」と呼ばれていてもオリジナルな [[BNF]]
ではなく、何らかの拡張や変更が加えられたものになっています。
また、大規模な変更を加えた [[ABNF]] や [[EBNF]] もよく用いられますが、
これらにもまた、様々な変種があります。

* 標準

[32] [[BNF]] と呼ばれるものは数多あり、それら全体の「標準」と言えるものは存在していません。

[5] [[ISO/IEC]] の仕様でも [[BNF]] やその変種がよく用いられます。
[[EBNF]] を規定した [[ISO/IEC 14977]]
という[[国際規格]]もあります (ただし、これを用いていない [[ISO/IEC]]
[[規格]]もあります)。

[17] [[IETF]] の定義する[[インターネット標準]]としては、 [[STD 68]]/[[RFC 5234]]
で定義される [[ABNF]] があります。

* 変種

[25] [[BNF]] には沢山の互いに互換性のない変種があります。
色々な場面でそれぞれの変種が使われており、どれが標準とは一概には言えません。

[FIG(short list)[
- [[ABNF]]
- [[EBNF]]
-[[DXLのBNF]]
-[[ISO 6093のBNF]]
-[[ISO/IEC 10646のBNF]]
-[[JIS X 4081のBNF]]
-[[PascalのBNF]]
-[[WBXMLのBNF]]
- [[RBNF]]
- [[R-BNF]]
- [[BNF擬似スキーマ]]
- [[XDRの拡張済BNF]]
]FIG]

[29] [CITE[第3章 TAD 詳細仕様書]], [TIME[2011-01-26T00:45:16.000Z]], [TIME[2022-08-25T14:12:19.734Z]] <http://www.chokanji.com/developer/doc/btron3/shared_data/tad1.html#abx>

[30] [CITE[Microsoft Word - 910-S004-uBNF_0.00.05-061012.doc - UID-CO00003-0.00.05.pdf]], [TIME[2010-09-27T02:04:40.000Z]], [TIME[2022-10-14T15:49:33.301Z]] <http://www.uidcenter.org/ja/wp-content/themes/wp.vicuna/pdf/UID-CO00003-0.00.05.pdf>

[31] [CITE[BSON (Binary JSON): Specification]], [TIME[2022-04-14T15:19:45.000Z]], [TIME[2023-04-17T05:04:34.463Z]] <https://bsonspec.org/spec.html>

>a pseudo-[ASIS[BNF][リンク]] syntax

(リンク先は[[English]]版[CITE[Wikipedia]])

を定義なく使っています。


* 限界

[21] [[BNF]] の表現能力の限界は、方言により様々です。しかし次のような制限があるのが一般的です。

[FIG(list)[
- [22] [[前方参照]]のようなもの ([[Perl]] の[[正規表現]]の [CODE[[[\[VAR[N]]]]]]) がないため、
[[XML]] の[[開始タグ]]と[[終了タグ]]の関係 ([[タグ名]]の[[一致]]) などが記述できない。
- [23] 正しい構文は記述できるが、誤った入力をどう処理するべきかは記述できない。
- [24] 構文は記述できるが、構文解析して得るべき[[データモデル]]との対応関係は記述できない。
]FIG]

[26] [[BNF]] の変種やその利用方法によっては、[[言語]]のすべてを記述することを諦め、
[[自然言語]]文で制約を記述したものを構文規則の一部として記述できることがあります。
専用の構文がなくても、[[注釈]]が実質的にそのように利用されていることがあります。

-*-*-

[27] [[BNF]] に限らず[[機械可読]]な構文記述方式では表現能力に限界があり、
[[仕様書]]の利用者の混乱の元になると非難する人もいます。
[[BNF]] 等の方が (一定の訓練を経た人なら) 記述された内容を理解しやすいかもしれませんが、
[[自然言語]]等でより詳細・厳密に記述する方が望ましいとされます。

[28] かつて [[HTML]] その他の [[Web]] に関する技術の[[仕様書]]では [[DTD]]
や [[ABNF]] が使われていました。しかし、
[[自然言語]]で記述された要件を無視して[[機械可読]]な要件だけを検査することで[[適合性]]を判断する誤った考え方の温床となっていたこと、
[[著者]]に対する[[生成]]の要件と[[実装]]に対する解釈の要件を明確に区別することが困難で混乱の元となること、
[[構文解析器]]の[[誤り]]の処理など実際の動作を厳密に記述できる方式が存在しないことなどにより、
[CITE[Web Applications 1.0]] (後の [[HTML5]]) 以来[[自然言語]]のみの記述に置き換えられていきました。
現在では限られた部分で [[ABNF]] によって[[著者]]に対する要件のみが記述されるにとどまっています。

* BNF とは何か

- [6] というか、はっきりいって、どんなのまで BNF と言うのかよく分からん。みんな好き勝手に拡張した自分の形式を BNF だと主張しているような。
- [7] 例えば [[JIS X 4081]]:2002 の「実体構造の表記法」は BNF なのかどうか。そうじゃないような気もするけどそうであるような気もするし。規格に BNF だとは書いてないから、 BNF じゃないのかな:)
- [8] [[SGML]] の[[要素]]の[[内容モデル]]も BNF のような気もするけど、それが BNF なら[[正規表現]]も BNF のような気がしてくる。しかし正規表現の一種のような [[XML]] の構文記述法は [[EBNF]] だったりする。
- [9] でも流石に [[ASN.1]] は BNF ではないわな。
- [10] >>8 SGML 内容モデルの記法は規格本文では構文の定義に使われてる。そしてその使われ方はいかにも BNF(ry
- [11] 単純な要素の線形連結を[[間隔]]を置いて並べるだけか、 [[COMMA]] を挟んで区切るのかの違いって、 BNF か否かに関係するのかな? もともとの BNF や [[IETF]] [[ABNF]] や XML の [[EBNF]] は間隔だけだけど、 SGML や JIS X 4081 は読点で区切っている。
- [12] >>11 正規表現は区切りに何もいらない。というか ([[perl]] 拡張とかでない限り) 間隔も入れちゃ駄目。 (間隔も読点もそれ自身として扱われる。)
- [13] >>9 ASN.1 は BNF に[[関数]]を導入しただけにも見える。 (''だけ''ではない?)
- [14] まあどれが BNF でどれが BNF でなくても良いが、結局構文記述のためのメタ構文は必然的に同じようなものになってしまうということか?



* 関連

- 類似した表記法
-- [[正規表現]] ― [[正規表現]]構文風味の [[BNF]] についてもこの項を参照。
-- [[内容モデル]] ― [[SGML]] や [[XML]] の[[要素内容]]の記述用の[[言語]]。
-- [[ASN.1]]
-- [[C#の構文記述方法]]
- 関係の深い概念
-- [[生成規則]]
-- [[再帰降下型構文解析]]

* メモ

- [1] ''About BNF notation'' <http://cui.unige.ch/db-research/Enseignement/analyseinfo/AboutBNF.html>
- [2] ''BNF etc.'' <http://www.cs.man.ac.uk/~pjj/bnf/bnf.html>
- [3] ''BNF and EBNF: What are they and how do they work?'' <http://www.garshol.priv.no/download/text/bnf.html>
- [4] '' 再帰下降構文解析 Recursive Descent Parsing'' <http://cl.aist-nara.ac.jp/staff/takashi/rec-desc/index.html>



[15]
[CITE[BNFとプログラム、、、?]]
<http://pc8.2ch.net/test/read.cgi/tech/1096884257/>


[18] [CITE[IRC logs: freenode / #whatwg / 20090906]]
([TIME[2009-10-17 22:08:59 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090906#l-169>

[19] [CITE[OWL 2 Web Ontology Language Manchester Syntax]]
( ([TIME[2012-10-18 22:45:56 +09:00]] 版))
<http://www.w3.org/TR/2012/NOTE-owl2-manchester-syntax-20121018/#The_Grammar>

[20] [CITE@ja[バッカス・ナウア記法 - Wikipedia]]
( ([TIME[2013-02-08 04:23:46 +09:00]] 版))
<http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95>