【ビーエヌエフきほう】

BNF記法 とは?

最終更新:
💡 書ける文の形を決める、文法のレシピ

言語の構文を、名前を付けた規則の組で表す記法。文脈自由文法を記述するために使い、基本的なBNFでは「::=」で定義、「|」で選択肢を表す。仕様書によって表記は異なり、拡張版のEBNFやABNFもある。

📌 このページのポイント
BNF:規則から、書ける形を読むこの例の規則<色> ::= red | blueredblue::= は定義 | は「または」<色>は規則名、redとblueは文字列記号の使い方は、仕様書ごとに確認
色名を選ぶ架空のBNFの例。矢印は規則が表す選択肢を示します。EBNF・ABNFなどの拡張記法は、使う記号も異なります。
ひよこ ひよこ
BNFは何を決めるもの?
ペンギン先生 ペンギン先生
文や記号を、どんな形で並べられるかを書く方法だよ。たとえば「色はredかblueのどちらか」という小さな言語も、規則として書ける。言語の仕様を読むときに役立つね。
ひよこ ひよこ
その規則は、どう書くの?
ペンギン先生 ペンギン先生
この例なら「<色> ::= red | blue」と書けるよ。<色>は規則の名前、::=は定義、|は「または」。redとblueは、これ以上規則へ分けない終端の文字列として使っているんだ。
ひよこ ひよこ
文法を書いたら、意味も全部決まる?
ペンギン先生 ペンギン先生
構文と意味は分けて考えよう。たとえば数の並びが文法に合っていても、それを色番号と読むか数量と読むかは、別の意味の規則が必要だね。BNFで書けば文法の曖昧さも自動で消える、というわけではないよ。
ひよこ ひよこ
EBNFはどう違うの?
ペンギン先生 ペンギン先生
繰り返しや省略を短く書ける拡張記法だよ。ISO/IEC 14977のEBNFでは、{ A }が0回以上の繰り返し、[ A ]が省略可能な部分。Pythonの仕様書では*や+も使うなど、表記の流儀が違うので説明を読もう。
ひよこ ひよこ
通信の仕様書にも出る?
ペンギン先生 ペンギン先生
RFCではABNFという拡張記法も使われるよ。RFC 5234では定義に=、選択肢に/を使う。BNFと同じ記号だと思い込まず、その仕様書の規則を確かめることが大切だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「BNF記法」って出てきたら「言語の文法を、規則の組で書く方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Backus–Naur Form」 = バッカス・ナウア記法
💬 BackusとNaurの名を含む呼び方。ALGOL 60の構文定義に使われた記法が、BNFとして知られるようになったんだ。

参考資料

← 用語集にもどる