【ビーエヌエフきほう】

BNF記法 とは?

💡 プログラミング言語の「レシピの書き方」を統一したフォーマット
📌 このページのポイント
BNF記法の構成要素 BNF記法 <if文> ::= if <条件> then <文> | if <条件> then <文> else <文> <条件> ::= <式> == <式> 記号の意味 < > 非終端記号 ::= 「〜と定義する」 | 「または」 太字 終端記号(キーワード) ※そのまま出力される文字列 EBNF(拡張BNF) 繰り返し: { A } 省略可能: [ A ] 主な用途 ・言語仕様書(C, Java, Python...) ・RFC(HTTP, URI, JSON...)
BNF記法のイメージ
ひよこ ひよこ

BNF記法って何に使うの?

ペンギン先生 ペンギン先生

プログラミング言語の構文ルールを正確に書き下すための記法だよ。たとえば「if文はこういう形で書く」というルールをあいまいさなく定義できるんだ。

ひよこ ひよこ

どんな書き方をするの?

ペンギン先生 ペンギン先生

たとえば「<digit> ::= 0 | 1 | 2 | ... | 9」のように書くよ。< >で囲んだものが非終端記号、::= は「〜と定義する」、| は「または」という意味だね。

ひよこ ひよこ

なるほど、言語の仕様書に載っているあの記法なんだね!

ペンギン先生 ペンギン先生

そう!ALGOLという言語の仕様を記述するために1960年頃に作られて、それ以来ほとんどの言語仕様で使われているよ。RFCなどの通信プロトコルの定義にも使われるんだ。

ひよこ ひよこ

EBNFっていうのも聞いたことがあるけど、何が違うの?

ペンギン先生 ペンギン先生

EBNFは拡張版で、繰り返しを { } で、省略可能な部分を [ ] で書けるようにしたものだよ。BNFだと繰り返しを再帰で書く必要があるけど、EBNFなら直感的に書けるんだ。

ひよこ ひよこ

BNF記法を理解すると何が嬉しいの?

ペンギン先生 ペンギン先生

言語のリファレンスが読めるようになるし、自分でDSL(ドメイン固有言語)やパーサーを作るときにも必須の知識だよ。構文解析ツールのyaccやANTLRも、BNFに近い記法で文法を定義するんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「BNF記法」って出てきたら「プログラミング言語の構文ルールを書くための共通フォーマット」と思えればだいたいOK!
📖 おまけ:英語の意味
「Backus-Naur Form」 = バッカス・ナウア記法
💬 考案者のJohn BackusとPeter Naurの名前から付けられた記法だよ
← 用語集にもどる