コンパイラ

式 2 + 3 * 4 の抽象構文木の形として正しいものはどれか。

  1. A根は + の節で、その右の子が 3 * 4 を表す * の節になる
  2. B根は * の節で、その左の子が 2 + 3 を表す + の節になる
  3. C2、3、4、+、* の5つの節が、すべて根の直接の子として並ぶ
答えと解説を見る

正解:A. 根は + の節で、その右の子が 3 * 4 を表す * の節になる

掛け算は足し算より優先順位が高いので、この式は 2 + (3 * 4) と解釈されます。抽象構文木では先に計算する演算ほど下に置かれるので、根は + で、その左の子が2、右の子が3と4を子にもつ * の節になります。木を下から評価すると、3 * 4 = 12 を先に計算し、2 + 12 = 14 が得られます。根が * になるのは (2 + 3) * 4 と書いた場合で、すべてを根の子に並べると計算の順番が表せません。

  • A. 正しい。優先順位の高い * が下になり、根は + です。
  • B. 根が * になるのは (2 + 3) * 4 の場合です。
  • C. 平らに並べると計算の順番が表せません。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. 中間表現の一つである三番地コードの特徴として正しいものはどれか。
  2. レジスタ割り当ての準備として行う生存区間(ライブネス)の解析で求めるものはどれか。
  3. ある関数の中で、同時に生きている値の数が最も多いところで5個だった。干渉グラフがこの5個以外の制約を生まない単純な場合、すべての値をスピルなしでレジスタに置くには、レジスタが少なくとも何個必要か。
  4. 繰り返し回数が100回のループを、本体を4回分並べるループ展開で書き換えると、回数の判定と分岐は何回になるか。(100は4で割り切れるものとする)
  5. C言語のプログラムから実行ファイルができるまでの一般的な流れとして正しいものはどれか。