平成23年度 特別 応用情報技術者試験 午前 問4
テクノロジ/基礎理論あるプログラム言語において,識別子(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
出典:平成23年度 特別 応用情報技術者試験 午前 問4
- ア<letter> | <digit> | <identifier><letter> | <identifier><digit>
- イ<letter> | <digit> | <letter><identifier> | <identifier><digit>
- ウ<letter> | <identifier><digit>
- エ<letter> | <identifier><digit> | <identifier><letter>
正解:エ
解説
識別子は「先頭が英字,それ以降は英数字が任意個続く文字列」です。BNFでは,1文字目のletterに続けて,identifier自身を再帰的に使いletterまたはdigitを1文字ずつ追加していく形で定義するのが一般的です。よって<identifier>::=<letter>|<identifier><letter>|<identifier><digit>という定義が該当します。
選択肢ごとの解説
- ア誤り。<identifier><letter>ではなく<letter><identifier>やそのほかの誤った並びを含んでおり,先頭が必ず英字になる保証がありません。
- イ誤り。<letter><identifier>という並びでは,識別子の末尾ではなく先頭にletterが来る形の再帰になり,2文字目以降がletterで始まる構造は生成されず,先頭が英字という制約を正しく表現できません。
- ウ誤り。<identifier><digit>だけでは,英字が2文字以上続く識別子(例:abc)を生成できません。
- エ正しい。<letter>から始まり,<identifier><letter>又は<identifier><digit>を再帰的に繰り返すことで,先頭が英字,以降が任意個の英数字という定義を正しく表せます。