次に示す記述は,BNFで表現されたあるプログラム言語の構文の一部である。
<パラメタ指定>として,適切なものはどれか。
<パラメタ指定> ::= <パラメタ>|(<パラメタ指定>,<パラメタ>)
<パラメタ> ::= <英字>|<パラメタ><英字>
<英字> ::= a|b|c|d|e|f|g|h|i
正答1
解説
正解は1です。
この問題は、BNF(Backus-Naur Form)で定義された構文規則に従って、<パラメタ指定>として導出できる文字列を選ぶものです。
<パラメタ>は英字a〜iを1文字以上並べたもので、括弧やコンマを含みません。
<パラメタ指定>は、<パラメタ>単独か、「(<パラメタ指定>,<パラメタ>)」の形のどちらかです。
つまり括弧は必ずコンマとセットで現れ、コンマの右側には括弧を含まない<パラメタ>だけが来ます。
【選択肢別解説】
1:○ abcとdefはどちらも<パラメタ>で、abcは単独で<パラメタ指定>にもなります。
そのため(abc,def)は「(<パラメタ指定>,<パラメタ>)」の形で<パラメタ指定>になります。
さらにそれを左側に置いた((abc,def),ghi)も、同じ規則で<パラメタ指定>になります。
2:× 内側の(abc,def)は正しい<パラメタ指定>ですが、それを括弧だけで囲む規則はありません。
外側の括弧の中にコンマと<パラメタ>がないため、((abc,def))は導出できません。
3:× (abc,(def))は、コンマの右側が(def)になっています。
コンマの右側は<パラメタ>でなければならず、<パラメタ>は英字だけで括弧を含まないため、導出できません。
4:× (abc)は、<パラメタ>を括弧で囲んだだけの形です。
括弧を使う規則は「(<パラメタ指定>,<パラメタ>)」だけなので、コンマのない括弧は作れません。
括弧を付けずにabcと書けば正しい<パラメタ指定>になります。
【ポイント】
BNFの問題は、規則の右辺に現れる記号(括弧やコンマ)がどのような組で出てくるかに注目すると素早く判定できます。
この規則では再帰が左側にあるため、括弧は左側に入れ子になって増えていきます。