추상 구문 트리(Abstract Syntax Tree, AST)는 소스 코드의 문법 구조를 트리 형태로 추상화한 중간 표현이다. 컴파일러, 인터프리터, 린터, 코드 변환 도구의 핵심으로 사용된다.
소스 코드에서 AST로
python
# 소스 코드
x = 1 + 2 * 3
# AST 구조:
Assign
├─ Name: x
└─ BinOp(+)
├─ Constant: 1
└─ BinOp(*)
├─ Constant: 2
└─ Constant: 3
연산자 우선순위, 괄호 등의 구문 정보가 트리 구조에 반영된다.
python
import ast
code = "result = 1 + 2 * 3"
tree = ast.parse(code)
print(ast.dump(tree, indent=2))
# Module(body=[Assign(...)])
# AST 방문자 패턴
class CallFinder(ast.NodeVisitor):
def visit_Call(self, node):
print(f"함수 호출: {ast.dump(node.func)}")
self.generic_visit(node)
CallFinder().visit(ast.parse("print(foo(x))"))
컴파일러 파이프라인
소스 코드
↓ 렉서 (Lexer/Tokenizer)
토큰 스트림
↓ 파서 (Parser)
CST (구체 구문 트리)
↓ 추상화
AST
↓ 의미 분석 (Semantic Analysis)
↓ 최적화
IR (중간 표현)
↓ 코드 생성
기계어 / 바이트코드
AST 활용 사례
- •린터: ESLint, Pylint — 코드 패턴 검사
- •포매터: Prettier, Black — 코드 재생성
- •번들러: Webpack, esbuild — import 분석
- •코드 변환: Babel — ES2015+ → ES5
- •타입 검사: TypeScript, mypy
- •코드 분석: 보안 취약점 탐지
관련 개념
- •컴파일러 — AST를 생성하고 사용하는 주체
- •정규표현식 — 렉서 단계에서 토큰 인식
- •이진 트리 — AST의 기반 자료구조
- •JIT 컴파일 — AST → 네이티브 코드