あるプログラム言語において,識別子(identifier)は,先頭が英字で始まり,それ以降に任意個の英数字が続く文字列である。
これをBNFで定義したとき,aに入るものはどれか。
<digit> ::= 0|1|2|3|4|5|6|7|8|9
<letter> ::= A|B|C|…|X|Y|Z|a|b|c|…|x|y|z
<identifier> ::= a
正答4
解説
正解は4です。
BNF(Backus-Naur Form:バッカス・ナウア記法)で、「先頭が英字、2文字目以降は英数字が任意個」という識別子を定義します。
1文字の英字を出発点とし、既にできた識別子の後ろに英字か数字を1文字ずつ付け足していく再帰的な定義が必要です。
【選択肢別解説】
1:× 先頭に<digit>単体を認めているので、「1」のような数字だけの文字列も識別子になってしまいます。
先頭が英字でなければならないという条件に反します。
2:× <digit>単体を認めているため、「1」のような数字1文字も識別子になります。
さらに<identifier><digit>と組み合わさると「12」のような数字だけの文字列も生成でき、先頭が英字という条件に反します。
3:× <letter>と<identifier><digit>だけでは、2文字目以降に英字を続けられません。
「ab」のような英字2文字の識別子を生成できないので誤りです。
4:○ <letter>で英字1文字の識別子を作り、<identifier><digit>と<identifier><letter>で後ろに英数字を足せます。
先頭は必ず英字になり、以降は英数字を何文字でも続けられます。
【ポイント】
BNFでは「|」が「または」を表し、左辺の記号を右辺で再び使うことで繰返しを表現します。
本問のように左側に<identifier>を置く形を左再帰と呼びます。