対象試験と出題頻度

BNF(バッカス・ナウア記法)は、基本情報技術者・応用情報技術者で出題されるテーマです。

構文規則の定義を読み解き、与えられた文字列が規則に合致するかを判定する問題が定番です。

 

R元年秋期 基本情報 午前問7、H30秋期 応用情報 午前問4など、複数の試験区分で繰り返し出題されています。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★☆☆
ランクB(標準)覚えておくと有利

用語の定義

情報処理試験を勉強していると、「BNFって何?あの山括弧と縦棒だらけの式は一体どう読むの?」と戸惑いがちです。

BNF(Backus-Naur Form:バッカス・ナウア記法)とは、一言で言うと

 「プログラミング言語などの構文規則を、記号を使って厳密に定義するための書き方(メタ言語)」

のことです。

イメージとしては、「料理レシピの文法ルールブック」です。

 

「カレーの作り方」ではなく、「レシピはどういう形式で書かなければならないか(材料名→分量→手順の順に書くこと、など)」を定めたルール。

BNFはプログラミング言語にとってのこの”ルールブック”にあたります。

📊 BNF(バッカス・ナウア記法)の基本情報

項目 内容
正式名称 Backus-Naur Form(バッカス・ナウア記法)
別名 BN記法、バッカス記法
用途 プログラミング言語やXMLなどの構文(文法)の定義
分類 メタ言語(言語を定義するための言語)

解説

プログラミング言語には「変数名は英字で始まること」「式の中で演算子はこう使うこと」といった文法上の約束事があります。

これを人間の自然言語(日本語や英語)で記述すると曖昧さが残るため、記号を使って誰が読んでも一意に解釈できる形式で書き下す必要がありました。

 

1960年前後、ALGOLというプログラミング言語の仕様策定にあたり、ジョン・バッカスとペーター・ナウアが考案したのがこの記法です。名前はそのまま二人の姓に由来しています。

 

BNFで使う3つの記号

BNFに登場する記号はたった3種類です。これさえ覚えれば、どんな構文定義でも読み解けます。

記号 読み方 意味
::= 「〜として定義する」 左辺を右辺の内容で定義する(左辺 ::= 右辺)
| 「または」 右辺の選択肢を区切る(A | B は「AまたはB」)
< > 「非終端記号」 さらに別の規則で置き換えが必要な要素。山括弧なしの文字(0, A など)は終端記号でそれ以上置き換えない

具体例で読み方を確認

次のBNFを実際に読んでみましょう。

<数字> ::= 0 | 1 | 2 | 3
<英字> ::= A | B | C
<変数名> ::= <英字> | <変数名><英字> | <変数名><数字>

これを日本語に直すと以下の通りです。

 

「<数字>は 0, 1, 2, 3 のどれか1文字」

「<英字>は A, B, C のどれか1文字」

「<変数名>は <英字>1文字か、<変数名>の後ろに<英字>が付いたもの、または<変数名>の後ろに<数字>が付いたもの」

となります。

 

3行目の定義に注目してください。<変数名>の定義の中に<変数名>自身が含まれています。これが「再帰的定義」と呼ばれるBNF最大の特徴です。

 

再帰的定義の展開イメージ

再帰を展開すると、<変数名>は「英字1文字で始まり、その後ろに英字または数字が0個以上続く文字列」を表していると分かります。

🔄 再帰展開の流れ(文字列「AB1」を検証する場合)

AB1 → 各文字を終端記号に変換
<英字><英字><数字>
<変数名><英字><数字> ←「A」が<英字>=<変数名>
<変数名><数字> ←「<変数名><英字>」=<変数名>
<変数名> ←「<変数名><数字>」=<変数名> ✅ 合致!
▶ EBNFとの違い(クリックで展開)

現在のプログラミング言語仕様では、BNFを拡張したEBNF(Extended BNF)が使われることが多くなっています。EBNFでは「繰り返し({ })」「省略可能([ ])」などの記号が追加され、再帰を使わずに「0回以上の繰り返し」を直接表現できます。

ただし、IPA試験で出題されるのは基本形のBNFです。EBNFの記号が出題されることはないため、ここでは割り切ってBNFの3記号だけ押さえれば十分です。

では、この記法が試験でどのように出題されるか見ていきましょう。

💡 BNFの核心を3行で

・「::=」は定義、「|」はOR、「< >」は非終端記号(さらに置き換えが必要な要素)
・定義の中に自分自身が登場する「再帰的定義」で繰り返しを表現する
・文字列が規則に合致するかは、終端記号→非終端記号へ逆方向にたどって最終的に目的の記号になるか確認する


試験ではこう出る!

BNFは、基本情報技術者・応用情報技術者の午前問題で繰り返し出題されています。

出題パターンは大きく2つに分かれます。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
FE R元年秋
午前 問7
BNFで定義された<変数名>に合致する文字列を選ぶ問題。 ・「英字で始まる」という先頭条件を再帰から読み取れるか
・アンダースコアや数字始まりのひっかけ選択肢
FE H23秋
午前 問4
BNFの規則から生成できる<式>を選ぶ問題。 ・括弧の有無による構文の合否判定
・演算子「+」「*」の扱いの違い
AP H30秋
午前 問4
<パラメータ指定>の再帰定義から適切な文字列を選ぶ問題。 ・括弧とカンマの入れ子構造を再帰で展開できるか
・外側の余分な括弧がひっかけ
AP H29秋
午前 問2
非終端記号<A>から生成される3桁の数字列を選ぶ問題。 ・3の剰余で分類する数学的なBNF
・複数の非終端記号の相互参照を整理する力

📝 IPA試験での出題パターン

パターン1:「定義に合致する文字列を選べ」
BNFの定義が示され、4つの文字列の中から規則に合致するものを選ぶ形式。解法は各選択肢を終端記号に変換し、再帰的に非終端記号へ畳み込んでいくこと。先頭文字の条件だけで絞れるケースが多い。

 

パターン2:「定義から生成できる式を選べ」
括弧や演算子を含む式の構文が定義され、規則通りに生成できるものを問う形式。括弧の位置や演算子の結合規則がひっかけになる。目的の非終端記号から順方向に展開し、選択肢の形に一致するかを確認するのが効率的。

 

試験ではここまででOKです。BNFの歴史やEBNFとの差異が問われることはないので、深追いは不要です。「3つの記号の意味」と「再帰の展開」ができれば確実に得点できます。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. BNF(バッカス・ナウア記法)の説明として、最も適切なものはどれでしょうか?

  • A. プログラムのソースコードを機械語に変換する際に、字句解析と意味解析を自動で行うソフトウェアのこと。
  • B. 「::=」「|」「< >」などの記号を用いて、プログラミング言語の構文規則を再帰的に定義するメタ言語のこと。
  • C. 演算子の優先順位を排除するために、演算子をオペランドの後ろに置いて表記する数式の記法のこと。

正解と解説を見る

正解:B

解説:
BNFは、「::=(定義)」「|(または)」「< >(非終端記号)」の記号を使ってプログラミング言語の構文を厳密に記述するメタ言語です。定義の中に自身を含める再帰的定義が最大の特徴です。

選択肢Aはコンパイラ(特に構文解析器)の説明です。BNFはコンパイラが解析する「規則」を定義する側であり、コンパイラそのものではありません。選択肢Cは逆ポーランド記法(後置記法)の説明です。数式の記述方法であり、言語の構文を定義するメタ言語とは役割が異なります。


よくある質問(FAQ)

Q. BNFの問題を速く解くコツはありますか?

あります。まず選択肢の先頭文字だけで絞り込むのが鉄則です。再帰定義の”底”(最も単純な定義)を見れば「先頭に来られる文字の種類」が分かります。R元年秋期FE 問7のように、先頭が英字でなければならない規則なら、数字やアンダースコアで始まる選択肢を即座に除外できます。残った候補だけ丁寧に展開すれば、時間を大幅に節約できます。

Q. 「非終端記号」と「終端記号」の違いを簡単に教えてください。

終端記号は「0」「A」「+」など、それ以上分解しない最終的な文字そのものです。非終端記号は「<変数名>」「<式>」のように山括弧で囲まれ、別の規則で置き換えが必要な”仮の名前”です。すべての非終端記号を終端記号だけに変換し終わった状態が、その構文規則で生成できる具体的な文字列になります。

Q. 実務でBNFに触れる場面はありますか?

あります。たとえばRFC(インターネット標準の仕様書)では、HTTPヘッダやURIの書式がABNF(Augmented BNF)という拡張形式で定義されています。SQLの構文仕様もBNFベースで記述されています。プログラミング言語を設計する場面だけでなく、既存の仕様書を正確に読み解く際にもBNFの知識は役立ちます。

Q. BNFと正規表現は同じものですか?

別物です。正規表現は「正規言語」と呼ばれる比較的単純なパターンしか表現できませんが、BNFは「文脈自由言語」という、括弧の対応や入れ子構造を含むより複雑な文法を定義できます。表現力はBNFのほうが上です。実務ではテキスト検索に正規表現、言語仕様の定義にBNFと、用途で使い分けます。