プログラミング言語などの文法を厳密に定義するための記法
BNF記法(Backus-Naur Form, バッカス・ナウア記法)とは、プログラミング言語などの文法を厳密に定義するための記法です。「どんな文字の並びが正しい文(プログラム)なのか」を、人が読んでも機械が読んでも曖昧さなく書き表せます。
身近な例えで言うと、BNFはレゴブロックの説明書のようなものです。「整数」という大きなパーツは「数字」という小さなパーツの組み合わせでできる、というように、複雑な構造を小さな部品の組み合わせで定義します。この「部品から組み立てる」考え方が文法定義の基本です。
上のツールで文法を選び▶ボタンを押すと、開始記号(例: <整数>)から規則を当てはめて、実際の文字列が組み立てられていく「導出」の過程を1ステップずつ追えます。紫が非終端記号、緑が終端記号です。
BNFでは、文法を表すための特別な記号「メタ記号(=記号についての記号)」を使います。主なものは次のとおりです。
・::=(または =):左辺を右辺のように「定義する」という意味。「〜とは〜である」と読む
・|:「または(選択肢)」。0 | 1 は「0 または 1」
・< > で囲んだもの:非終端記号(=さらに別の規則で定義される、展開できる記号)
・囲まれていない文字:終端記号(=それ以上展開できない、最終的に現れる文字そのもの)
たとえば <数字> ::= 0 | 1 | … | 9 は「数字とは 0 から 9 のいずれか1つである」という定義です。非終端記号は「これから組み立てる材料」、終端記号は「完成した部品」と考えると区別しやすくなります。
BNFは実際のプログラミング言語の仕様書で広く使われています。変数名・数値・式・文といった言語のすべての構成要素がBNF(やその拡張)で定義されており、コンパイラはこの定義に従ってソースコードが正しいか判定します。
BNFの強力な点は再帰的な定義ができることです。たとえば <整数> ::= <数字> | <整数><数字> は「整数とは、1個の数字、または(すでにある)整数の後ろに数字を1つ付けたもの」という定義。自分自身を使って自分を定義することで、何桁でも続く整数を有限の規則で表現できます。
ある文字列がBNF定義に当てはまるかを確かめるには、その文字列を開始記号から規則をたどって組み立てられるかを確認します。なお、BNFを拡張して繰返しや省略を簡潔に書けるようにしたものをEBNF(拡張BNF)と呼びます。