基本情報技術者試験 令和元年度 秋季 午前 問7
BNF についての問題。
--------------------------
令和元年度 秋期 午前 問7
次の BNF で定義される <変数名> に合致するものはどれか。
<数字> :: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<英字> :: = A | B | C | D | E | F
<英数字> :: = <英字> | <数字> | _
<変数名> :: = <英字> | <変数名><英数字>
ア _B39
イ 246
ウ 3E5
エ F5_1
--------------------------
解説
BNF とは、バッカス・ナウア記法(Backus-Naur Form) の略。
"文脈自由文法を定義するためのメタ言語" とのことであるが、この文章がまずわかりにくい。
文法(この問題だと "<変数名>" とかの構造)を定義するためのもの、と思えばいい。
<数字> :: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
順番に見ていくとして、上の BNF における "<数字>" は 0 から 9 のどれかという意味になる。
なので、ここでは 10 とか 100 は "<数字>" ではない(定義に当てはまらない)。
"<数字><数字>" という BNF がもしあれば、10 とか 99 とかが当てはまる。
"<数字><数字><数字>" という BNF がもしあれば、100 とか 256 とかが当てはまる。
<英字> :: = A | B | C | D | E | F
次に上の BNF について。
ここでは "<英字>" は A か B か C か D か E か F のどれかという意味になる。
なので、ここでは Z は "<英字>" ではないし、2 文字以上でも "<英字>" ではない。
<英数字> :: = <英字> | <数字> | _
続いて上の BNF について。
"<英数字>" という定義の中に、先に説明した "<英字>" と "<数字>" が入っている。
"<英数字>" は "<英字>" か "<数字>" か _ のどれか、という意味になる。
"<英字>" と "<数字>" については上の説明の通り。
ということで、ここでは "<英数字>" は A, B, C, D, E, F, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _ のうちどれか一文字という意味になる。
<変数名> :: = <英字> | <変数名><英数字>
最後の BNF について。
"<変数名>" の定義の中に自分自身である "<変数名>" が含まれていてややこしい。
"<変数名>" は "<英字>" か "<変数名><英数字>" のどちらか、という意味になる。
"<英字>" の場合は A, B, C, D, E, F のどれかなのでわかりやすい。
A の一文字だけでも、"<変数名>" の定義には当てはまることになる。
"<変数名><英数字>" の場合は再び "<変数名>" がでてきてしまう。
以下、少しでも見やすくするため <変数名> に色を付けてみる。
"<変数名>" は "<英字>" か "<変数名><英数字>" なので、
"<変数名><英数字>" は "<英字><英数字>" か "<変数名><英数字><英数字>" になる。
同じようにして、"<変数名><英数字><英数字>" は "<英字><英数字><英数字>" か "<変数名><英数字><英数字><英数字>" になる。
なんとなくパターンが見えてきた通り、"<変数名>" は
"<英字>"
"<英字><英数字>"
"<英字><英数字><英数字>"
"<英字><英数字><英数字><英数字>"
"<英字><英数字><英数字><英数字>・・・<英数字>"
といった様に先頭が "<英字>" で、その後ろに任意の数だけ "<英数字>" が続く BNF になる。
問題の各選択肢がこの定義にあっているかをみてみる。
選択肢ア "_B39"、選択肢イ "246"、選択肢ウ "3E5"、はどれも先頭が "<英字>" ではないので誤り。
選択肢エ "F5_1" は先頭が "<英字>" の定義に当てはまり、"<英字><英数字><英数字><英数字>" の BNF に合致する。ということで正解は選択肢エ。
前後の問題はこちら。