ソフトウェア
次の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+" が付く。
出典: AI生成問題(学習用)