メインコンテンツへ
ソフトウェア

次のBNF(バッカス・ナウア記法)で定義された文法に従ったとき、"a+a*a" がどのように導出されるかを正しく説明したものはどれか。 <E> ::= <E> "+" <T> | <T> <T> ::= <T> "*" <F> | <F> <F> ::= "a"

ア."a+a*a" は左から順にトークンを処理し、"a+a" が先に乗算され、その後 "*a" が加算される
イ.BNFで加算は乗算より優先されるため "a+a" が先に計算される
ウ.<E>と<T>の階層構造により乗算が加算より高い優先度を持ち、"a*a" が先に結合される正解
エ.BNFは演算子優先度を表現できないため、"a+a*a" の評価順序は文法から決定できない

解説

BNFの階層構造に演算子優先度が隠れている!Eより下のTに乗算を書くことで「乗算はより基本的な単位(結合が強い)」を表現。数学の掛け算優先と同じ原理!

なぜ ウ が正解か

この文法の階層: <E>(最低優先度=加算)→<T>(中間=乗算)→<F>(最高=アトム)。導出ツリー: "a+a*a" → <E> = <E>+<T> = <T>+<T>*<F> = <F>+<F>*<F> = a+a*a。ツリー上で乗算(<T>)は加算(<E>)より深い階層にあるため、乗算が先に結合される(高い優先度)。これにより "a*a" が先にグルーピングされ、その結果に "a+" が付く。

なぜ ア は間違いか

「a+aが先に乗算される」は文法と逆。加算は<E>レベル(最低優先)であり、乗算(<T>レベル)より後に解析される。

なぜ イ は間違いか

BNFのこの定義では加算が低い優先度(<E>は最上位の非終端記号)。加算が先に計算される記述は誤り。

なぜ エ は間違いか

BNFは階層的な非終端記号の定義により演算子優先度を表現できる。評価順序は文法から明確に決定される。

出典: AI生成問題(学習用)