컴파일러

식 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. 중간 표현의 하나인 3-주소 코드의 특징으로 올바른 것은?
  2. 레지스터 할당의 준비로 수행하는 생존 구간(라이브니스) 분석에서 구하는 것은?
  3. 어떤 함수 안에서 동시에 살아 있는 값의 수가 가장 많은 곳에서 5개였다. 간섭 그래프가 이 5개 이외의 제약을 만들지 않는 단순한 경우, 모든 값을 스필 없이 레지스터에 두려면 레지스터가 최소 몇 개 필요한가?
  4. 반복 횟수가 100회인 루프를 본체를 4번 분량 나열하는 루프 전개로 바꿔 쓰면, 횟수 판정과 분기는 몇 번이 되는가? (100은 4로 나누어떨어진다고 가정한다)
  5. C 언어 프로그램에서 실행 파일이 만들어지기까지의 일반적인 흐름으로 올바른 것은 무엇인가?

이 분야의 비교