バッカス・ナウア記法
今日、インターネット上で見つかるBNF表現の多くは人間が読むことを重視しており、非形式的である。そのため、以下のような構文規則の拡張をしていることが多い。
省略可能なアイテムは角括弧で囲む。例えば、[<item-x>]
0回以上繰り返すアイテムは中括弧で囲む。例えば、<word> ::= <letter> { <letter> }
1回以上繰り返すアイテムには + を後置する。<word> ::= <letter>+
終端記号をボールド体、非終端記号を通常の文字で表し、イタリック体や山括弧を使わない。
アイテムの繰り返しを * を後置することで表すことが多い。
生成時の選択肢を | 記号で区切って列挙する。例えば、<alternative-a> | <alternative-b>
アイテムをグループ化する必要があるときは、普通の括弧で囲む。
セミコロンに続けて註釈を付ける。
バッカス・ナウア記法(英: Backus–Naur form)とは、文脈自由文法を定義するのに用いられるメタ言語のことで、一般にBNFやBN記法と略される。現在はこのBNFを拡張したEBNF (Extended BNF) が一般的に使われている。EBNFでは正規表現を用いてより簡単に記述でき、プロトコル規定言語であるASN.1や、XMLの構文定義にも利用されている。
ジョン・バッカスとピーター・ナウアがALGOL 60 の文法定義のために考案。当初は文脈自由文法の本来の定義に則り or(|)以外の定義はなく、繰り返しは再帰を利用して表現されている。*、?等の量化子はBNFを拡張したEBNFによって導入された。パーサジェネレータを使用して構文解析器を生成する際に、構文を定義するためにも使う。
ISO/IEC 14977:1996においてEBNFの標準が定義されているが、EBNFにもいろいろな亜種や変種がある。例えば、RFC2234にはABNF (Augmented BNF) という変種が定義されている。しかし、ABNFは標準のEBNFとかなり異なる部分がある。
BNF の文法は BNF 自体を使って以下のように表現できる。ただし、本来の BNF では引用符 (") は使わない。
ここで、構文規則を正しく翻訳するには空白 (whitespace) が必要であるとしている。<eol> は適当な行末を示す記号(改行コード)である。<rule-name> は宣言された規則の名前またはラベルに、<text> はテキストに置き換えられる。