基本情報技術者 2011年 秋期 午前(科目A) 問04
問題文
次の規則から生成することができる式はどれか。
〔規則〕
<式> ::= <変数>|(<式>+<式>)|<式>*<式>
<変数> ::= A | B | C | D
選択肢
ア:A+(B+C)*D
イ:(A+B)+(C+D)
ウ:(A+B)*(C+D)(正解)
エ:(AB)+(CD)
次の規則から生成可能な式はどれか【午前2 解説】
要点まとめ
- 結論:与えられた生成規則から生成できる式は (A+B)*(C+D) のみで,外側の加算は必ず丸括弧で囲む必要があります。
- 根拠: のため,加算は常に丸括弧で包まれ,乗算は括弧なしで二項結合できます。
- 差がつくポイント:式を上から見る(トップレベル演算子の確認)と,括弧がどの生成規則由来かを見分けることが合否を分けます。
正解の理由
正解は ウ です。
理由:文法 により,左右に加算を並べる場合は必ずその加算全体を丸括弧で囲む形式 でしか生成できません。一方,乗算は の形で括弧なしに結合可能です。
ウの (A+B)*(C+D) は左辺と右辺がそれぞれ で生成でき,その二つを で結合して全体の を作れるため生成可能です。
理由:文法 により,左右に加算を並べる場合は必ずその加算全体を丸括弧で囲む形式 でしか生成できません。一方,乗算は の形で括弧なしに結合可能です。
ウの (A+B)*(C+D) は左辺と右辺がそれぞれ で生成でき,その二つを で結合して全体の を作れるため生成可能です。
よくある誤解
- 「通常の算術と同じ優先順位で判断してよい」:今回の文法は演算子優先や任意の括弧挿入を許しておらず,文法規則に従う必要があります。
- 「丸括弧は任意に置ける」と思う誤り:丸括弧は加算 のためだけに出現し,任意の式を囲むための生成規則は存在しません。
- 「ABC は不可」と誤認する:乗算は再帰的に結合できるため生成可能(結合の仕方は文法で決まる)です。
解法ステップ
- 式のトップレベル演算子(最外側で見える '+' または '*')を確認する。
- トップが '+' なら全体が丸括弧で囲まれているかを確認、囲まれていなければ生成不可。
- トップが '*' なら左右の項がそれぞれ として生成可能か(特に であるか、単純変数か、さらに乗算でつながるか)を確認する。
- 各部分について再帰的に同じ確認を行い,すべて文法に従うなら生成可能とする。
選択肢別の誤答解説
- ア: A+(B+C)*D
- 誤り点:全体のトップレベル演算子は '+' であるが,その加算が丸括弧で囲まれていないため文法 に合致しません。よって生成不可です。
- イ: (A+B)+(C+D)
- 誤り点:左辺・右辺の (A+B), (C+D) は で生成可能ですが,その二つを結ぶトップレベルの '+' が丸括弧で包まれていません。外側の加算も でなければならないため生成不可です。
- ウ: (A+B)*(C+D)
- 正答。左は (A と B の加算),右も同様で,それらを で結合すれば全体が として生成できます。具体的には の形になります。
- エ: (AB)+(CD)
- 誤り点:左の (AB) や右の (CD) は「丸括弧で囲まれた形」ですが,文法上は丸括弧は加算のための構文 の一部であり,乗算を丸括弧で囲む生成規則はありません。さらに,全体をつなぐ '+' も外側が丸括弧で包まれていないため二重に不適合です。
補足コラム
- 文法の見方: のように項同士を連結する生成規則がある場合,乗算は括弧なしで連続して現れ得ます(例:ABC は の形で生成可能)。一方,加算は必ず
(<式>+<式>)
のように括弧を伴って出現します。 - パーサ視点:この文法は文脈自由文法(BNF風)であり,AST(抽象構文木)を想定すると加算ノードは必ず括弧を示す内部ノードとして現れます。括弧の有無は構文的に重要な手がかりです。
FAQ
Q1. (A+B)+C は生成できますか?
A1. 表記そのままでは生成できません。外側の加算は丸括弧で囲まれる必要があるため,((A+B)+C) のように外側も括弧で包めば生成可能です。
A1. 表記そのままでは生成できません。外側の加算は丸括弧で囲まれる必要があるため,((A+B)+C) のように外側も括弧で包めば生成可能です。
Q2. ABC のように括弧がない乗算は生成可能ですか?
A2. はい。乗算は の再帰で表現できるため,例えば ABC は のように派生できます(文法は結合の順序を許します)。
A2. はい。乗算は の再帰で表現できるため,例えば ABC は のように派生できます(文法は結合の順序を許します)。
Q3. 任意の部分式を丸括弧で囲えますか?
A3. いいえ。丸括弧は文法上 の一部としてのみ現れるため,任意の式を囲むための生成規則はありません。例えば (A*B) は文法で生成できません。
A3. いいえ。丸括弧は文法上 の一部としてのみ現れるため,任意の式を囲むための生成規則はありません。例えば (A*B) は文法で生成できません。
関連キーワード: 生成文法、BNF、再帰文法、構文解析、抽象構文木、演算子結合性、括弧の意味、文脈自由文法、生成規則

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

