この試験の対策ガイド

基本情報技術者試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は エ

解説

BNF(バッカス・ナウア記法)の定義を読み解く問題です。BNF は「::=」の左辺の記号が右辺のパターンで定義されること、「|」が選択(または)を表すことが基本ルールです。本問の定義を整理すると、<数字>は0〜9、<英字>はA〜F、<英数字>は<英字>・<数字>・アンダースコア(_)のいずれか、そして<変数名>は「<英字>」または「<変数名><英数字>」です。<変数名>の定義が自分自身を含む再帰的な形になっている点が重要で、これを展開すると「先頭は必ず<英字>(A〜F)で始まり、2文字目以降には<英数字>(英字・数字・_)を任意の個数並べられる」ことを意味します。F5_1 を検証すると、F が<英字>なので<変数名>、F5 は<変数名>+<英数字>で<変数名>、F5_ も同様、F5_1 も同様、と順に導出でき、定義に合致します。エが正解です。BNF の再帰定義は「基底になる最初の1文字に何が許されるか」を読み取ることが解法の核心です。

なぜ他の選択肢は違うのか

選択肢 ア
_B39 は先頭がアンダースコア(_)です。_ は<英数字>の定義には含まれているため2文字目以降には使えますが、<変数名>の再帰の基底(出発点)は<英字>のみと定義されているので、変数名の先頭に _ を置くことはできません。「その文字が使えるかどうか」ではなく「その位置に使えるかどうか」を区別して定義を読むことが、この問題の最大のポイントです。
選択肢 イ
246 は先頭が数字の2です。数字は<英数字>に含まれるので2文字目以降には使えますが、<変数名>の定義の基底は<英字>だけであり、数字から始まる文字列は<変数名>として導出できません。C言語など多くのプログラム言語で「変数名は数字で始められない」という規則がありますが、それと同じ構造が BNF で表現されていると理解すると覚えやすいでしょう。
選択肢 ウ
3E5 は先頭が数字の3です。2文字目の E と3文字目の5自体は<英数字>として有効な文字ですが、先頭が数字である時点で<変数名>の導出規則(必ず<英字>から始まる)に違反するため、それ以降を確認するまでもなく不適合です。BNF 問題では全文字を検証する前に、まず先頭文字だけをチェックすれば選択肢の大半を素早く除外できます。

解くときのポイント

再帰的BNFは「基底(最初の1文字に何が許されるか)」と「繰返し部分(2文字目以降)」に分けて読む。先頭文字のチェックだけで選択肢の大半を消せることが多い。