FE EXAM

BNF記法(バッカス・ナウア記法)

プログラミング言語などの文法を厳密に定義するための記法

INTERACTIVE VISUALIZATION
非終端記号
終端記号
開始記号
<整数>
導出される文字列の例
0
BNF定義
<数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<整数> ::= <数字> | <整数><数字>
BNF文法
導出ステップ
STEP 1/3開始記号一番左の非終端記号(紫)を、対応する規則の右辺に置き換えます。
導出中の記号列(文形式)
<整数>
導出の履歴
<整数>
解説

📌
BNF記法とは

<整数>::=<数字>|…続く左辺定義右辺(選択肢)

BNF記法(Backus-Naur Form, バッカス・ナウア記法)とは、プログラミング言語などの文法を厳密に定義するための記法です。「どんな文字の並びが正しい文(プログラム)なのか」を、人が読んでも機械が読んでも曖昧さなく書き表せます。

身近な例えで言うと、BNFはレゴブロックの説明書のようなものです。「整数」という大きなパーツは「数字」という小さなパーツの組み合わせでできる、というように、複雑な構造を小さな部品の組み合わせで定義します。この「部品から組み立てる」考え方が文法定義の基本です。

上のツールで文法を選び▶ボタンを押すと、開始記号(例: <整数>)から規則を当てはめて、実際の文字列が組み立てられていく「導出」の過程を1ステップずつ追えます。紫が非終端記号、緑が終端記号です。

🔣
メタ記号の意味

::=定義する|または< >非終端記号0 1終端記号

BNFでは、文法を表すための特別な記号「メタ記号(=記号についての記号)」を使います。主なものは次のとおりです。

::=(または =):左辺を右辺のように「定義する」という意味。「〜とは〜である」と読む
|:「または(選択肢)」。0 | 1 は「0 または 1」
< > で囲んだもの:非終端記号(=さらに別の規則で定義される、展開できる記号)
・囲まれていない文字:終端記号(=それ以上展開できない、最終的に現れる文字そのもの)

たとえば <数字> ::= 0 | 1 | … | 9 は「数字とは 0 から 9 のいずれか1つである」という定義です。非終端記号は「これから組み立てる材料」、終端記号は「完成した部品」と考えると区別しやすくなります。

💻
プログラム言語の文法定義

整数の組み立て(再帰)<整数><整数><数字>123規則を繰り返し当てはめて桁を増やす

BNFは実際のプログラミング言語の仕様書で広く使われています。変数名・数値・式・文といった言語のすべての構成要素がBNF(やその拡張)で定義されており、コンパイラはこの定義に従ってソースコードが正しいか判定します。

BNFの強力な点は再帰的な定義ができることです。たとえば <整数> ::= <数字> | <整数><数字> は「整数とは、1個の数字、または(すでにある)整数の後ろに数字を1つ付けたもの」という定義。自分自身を使って自分を定義することで、何桁でも続く整数を有限の規則で表現できます。

ある文字列がBNF定義に当てはまるかを確かめるには、その文字列を開始記号から規則をたどって組み立てられるかを確認します。なお、BNFを拡張して繰返しや省略を簡潔に書けるようにしたものをEBNF(拡張BNF)と呼びます。

関連コンテンツ