추상 구문 트리

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2026.04.16
조회수
5
버전
v1

추상 구문 트리

개요

추상 구문 트리(Abstract Syntax Tree, 이하 AST)는 소스 코드의 구조를 계층적이고 추상화된 형태로 표현한 트리 구조입니다. 컴파일러나 인터프리터가 소스 코드를 해석하고 분석하는 과정에서 핵심적인 역할을 하며, 구문 분석(파싱) 단계 이후 생성됩니다. AST는 실제 코드의 구문적 요소(예: 괄호, 세미콜론 등)를 생략하고, 프로그램의 의미적 구조에 초점을 맞춰 표현합니다.

예를 들어, 2 + 3 * 4라는 수식은 AST를 통해 연산자와 피연산자의 계층 관계를 명확히 하여, 곱셈이 덧셈보다 먼저 수행되어야 함을 시각적으로 표현할 수 있습니다.

AST는 컴파일러의 중간 표현(Intermediate Representation, IR)로 널리 사용되며, 정적 분석, 코드 변환, 최적화, 코드 생성 등 다양한 후속 처리에 활용됩니다.


AST의 생성 과정

1. 어휘 분석 (Lexical Analysis)

소스 코드는 먼저 어휘 분석기(Lexer)에 의해 토큰(Token)으로 분해됩니다. 토큰은 키워드, 식별자, 연산자, 리터럴 등 코드의 기본 구성 요소입니다. 예를 들어, if (x > 5) { y = 10; }는 다음과 같은 토큰으로 나뉩니다:

  • if, (, x, >, 5, ), {, y, =, 10, ;, }

2. 구문 분석 (Parsing)

이후 구문 분석기(Parser)는 토큰의 나열이 언어의 문법 규칙에 부합하는지 검사하고, 이를 바탕으로 구문 트리(Parse Tree)를 생성합니다. 구문 트리는 문법 규칙의 모든 세부 사항을 포함하므로 상대적으로 복잡합니다.

AST는 이 구문 트리를 단순화하여 의미 있는 구조만 남긴 것입니다. 예를 들어, 괄호나 세미콜론과 같은 구분 기호는 AST에서 제거되며, 중복되는 노드는 통합됩니다.


AST의 구조와 구성 요소

AST는 노드(Node)와 간선(Edge)으로 구성된 트리 구조입니다. 각 노드는 프로그램의 특정 구문 요소를 나타냅니다.

주요 노드 유형

노드 유형 설명
[Program](/doc/%EA%B8%B0%EC%88%A0/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/AST%20%EB%85%B8%EB%93%9C%20%EC%9C%A0%ED%98%95/Program) 전체 프로그램의 루트 노드
[FunctionDeclaration](/doc/%EA%B8%B0%EC%88%A0/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/AST%20%EB%85%B8%EB%93%9C%20%EC%9C%A0%ED%98%95/FunctionDeclaration) 함수 선언을 나타냄 (이름, 매개변수, 본문 포함)
[VariableDeclaration](/doc/%EA%B8%B0%EC%88%A0/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/AST%20%EB%85%B8%EB%93%9C%20%EC%9C%A0%ED%98%95/VariableDeclaration) 변수 선언 (예: let x = 5;)
[BinaryExpression](/doc/%EA%B8%B0%EC%88%A0/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99/AST%20%EB%85%B8%EB%93%9C%20%EC%9C%A0%ED%98%95/BinaryExpression) 이항 연산 (예: +, -, *, /)
[Identifier](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EB%B3%80%EC%88%98%EC%99%80%20%EC%8B%9D%EB%B3%84%EC%9E%90/Identifier) 변수나 함수 이름
[Literal](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EC%9C%A0%ED%98%95/Literal) 숫자, 문자열, 불리언 등 상수 값
[IfStatement](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%A0%9C%EC%96%B4%20%EA%B5%AC%EC%A1%B0/IfStatement) 조건문 (if, else)
[CallExpression](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%ED%95%A8%EC%88%98%20%ED%98%B8%EC%B6%9C/CallExpression) 함수 호출 (예: func(1, 2))

예시: 간단한 코드의 AST

다음 자바스크립트 코드를 예로 들어보겠습니다:

let result = 10 + 20;

이 코드의 AST는 다음과 같이 표현될 수 있습니다:

{
  "type": "Program",
  "body": [
    {
      "type": "VariableDeclaration",
      "kind": "let",
      "declarations": [
        {
          "type": "VariableDeclarator",
          "id": { "type": "Identifier", "name": "result" },
          "init": {
            "type": "BinaryExpression",
            "operator": "+",
            "left": { "type": "Literal", "value": 10 },
            "right": { "type": "Literal", "value": 20 }
          }
        }
      ]
    }
  ]
}

이 구조는 변수 선언과 초기화 과정을 계층적으로 명확히 보여줍니다.


AST의 활용 분야

1. 정적 코드 분석

AST는 코드의 구조를 기반으로 버그, 보안 취약점, 스타일 위반 등을 탐지하는 데 사용됩니다. 예를 들어, ESLint는 자바스크립트 코드를 AST로 변환한 후, 규칙에 따라 노드를 탐색하며 경고를 생성합니다.

2. 코드 변환 및 트랜스파일링

Babel과 같은 트랜스파일러는 최신 자바스크립트 문법을 이전 버전으로 변환할 때 AST를 활용합니다. 먼저 소스 코드를 AST로 변환하고, 노드를 수정한 후, 다시 코드로 출력합니다.

3. 컴파일러 최적화

컴파일러는 AST를 기반으로 상수 폴딩(Constant Folding), 불필요한 코드 제거(Dead Code Elimination), 루프 최적화 등을 수행합니다. 예를 들어, 2 + 3은 AST에서 5로 사전 계산될 수 있습니다.

4. 코드 생성

AST는 최종적으로 기계어, 바이트코드, 또는 다른 고급 언어로의 코드 생성을 위한 기초 자료로 사용됩니다. 각 노드는 대상 아키텍처에 맞는 명령어로 매핑됩니다.


AST와 관련된 도구

  • Esprima: 자바스크립트 파서로, AST를 생성하는 데 사용됨
  • Babel Parser (Babylon): Babel에서 사용하는 파서로, 최신 JS 문법 지원
  • AST Explorer: 웹 기반 도구로, 코드를 입력하면 실시간으로 AST를 시각화
  • Tree-sitter: 고성능 구문 분석 엔진으로, 여러 언어의 AST 생성 가능

참고 자료


AST는 현대 소프트웨어 개발 도구의 핵심 기반 기술 중 하나로, 코드의 구조를 기계가 이해할 수 있는 형태로 변환함으로써 다양한 자동화와 분석이 가능하게 합니다. 컴파일러 설계뿐 아니라 정적 분석, 리팩터링 도구, LSP(Language Server Protocol) 등에서도 필수적인 역할을 수행하고 있습니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?