応用情報技術者試験 平成30年秋 午前問4 解説付き過去問
問題
次に示す記述は、BNFで表現されたあるプログラム言語の構文の一部である。
<パラメタ指定>として、適切なものはどれか。
<パラメータ指定>::=<パラメータ>|(<パラメータ指定>、<パラメータ>)
<パラメータ>::=<英字>|<パラメータ><英字>
<英字>::=a|b|c|d|e|f|g|h|i
<パラメータ指定>::=<パラメータ>|(<パラメータ指定>、<パラメータ>)
<パラメータ>::=<英字>|<パラメータ><英字>
<英字>::=a|b|c|d|e|f|g|h|i
正解
解説
この問題は、BNF(バッカス・ナウア記法)によって定義された構文規則に基づき、与えられた文字列が正しい構文かどうかを判断するものです。
- BNF構文の定義内容
問題文では、以下のようなBNF構文が示されています:
・<パラメータ指定> ::= <パラメータ>|(<パラメータ指定>, <パラメータ>)
・<パラメータ> ::= <英字>|<パラメータ><英字>
・<英字> ::= a|b|c|d|e|f|g|h|i
この規則から、パラメータは a~i の英字を1文字以上連結した文字列であり、パラメータ指定はそれをカンマでつないで括弧で囲む構造を再帰的に持つことがわかります。 - 各選択肢の構文検証
以下に、各選択肢がBNFに従って展開可能かを確認します。- 選択肢 ((abc,def),ghi)
・abc, def, ghi はいずれも <パラメータ> に該当
・(abc,def) は <パラメータ指定>
・((abc,def),ghi) は (<パラメータ指定>, <パラメータ>) なので <パラメータ指定> に合致
→ 構文として正しい。 - 選択肢 ((abc,def))
・abc, def は <パラメータ>
・(abc,def) は <パラメータ指定>
・((abc,def)) は (<パラメータ指定>) だが、これはどの構文規則にも該当しない
→ 構文として不適切。 - 選択肢 (abc,(def))
・abc は <パラメータ>
・(def) は不正な構造(単一のパラメータを括弧で囲む形式は定義されていない)
→ 構文として不適切。 - 選択肢 (abc)
・abc は <パラメータ>
・(abc) という形式は定義上のどの構文にも合致しない
→ 構文として不適切。
- 選択肢 ((abc,def),ghi)
- 結論
与えられた構文定義に従い、最終的に <パラメータ指定> に正しく還元されるのは ((abc,def),ghi) のみです。これが唯一正しい構文です。
したがって、BNFの構文規則に最も適合する正しい形式は ((abc,def),ghi) です。