
AST(추상 구문 트리, Abstract Syntax Tree)는 소스 코드의 구조를 트리 형태로 표현한 것입니다. 각 노드는 소스 코드의 구성 요소를 나타내며, 트리의 구조를 통해 코드의 구문적 의미를 표현합니다. AST는 컴파일러와 인터프리터에서 코드 분석, 최적화, 변환 등에 사용됩니다.
int x = a + b * c;
이 코드는 AST로 다음과 같이 표현될 수 있습니다:
=
/ \
x +
/ \
a *
/ \
b c
정규표현식(Regular Expression)은 문자열에서 특정 패턴을 찾거나, 치환하거나, 추출하는 데 사용되는 도구입니다. 주로 텍스트 처리, 데이터 검증, 검색 및 교체 작업에서 많이 사용됩니다.
a, 1, $. (임의의 한 문자), * (0개 이상의 반복)[abc]^ (문자열의 시작), $ (문자열의 끝)(abc)이메일 주소를 검증하는 정규표현식:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
컴파일러(Compiler)는 고급 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 저급 언어(기계어)로 변환하는 프로그램입니다. 컴파일러는 코드의 번역뿐만 아니라 최적화, 오류 검출 등의 작업도 수행합니다. 컴파일 과정은 여러 단계를 거치며, 이 과정을 통해 실행 가능한 바이너리 파일을 생성합니다.
Tokenizer는 소스 코드를 가장 작은 의미 단위인 토큰으로 분리하는 단계입니다. 여기서 토큰은 변수, 연산자, 키워드, 숫자 등으로 구성됩니다. 예를 들어, int x = 5;라는 코드에서 int, x, =, 5, ;는 각각 하나의 토큰입니다.
Lexer는 Tokenizer가 생성한 토큰을 받아 어휘 분석을 수행합니다. 각 토큰의 유형을 결정하고, 이를 기반으로 어휘적 오류를 처리합니다. 예를 들어, 토큰이 변수인지, 키워드인지, 연산자인지 등을 식별합니다.
Parser는 Lexer가 생성한 어휘 정보를 받아 구문 분석을 수행합니다. 구문 분석은 토큰의 순서를 바탕으로 문법을 확인하고, 이를 구문 트리(Syntax Tree)로 구성합니다. 구문 트리는 코드의 구조를 표현하며, 컴파일러가 다음 단계로 진행할 수 있도록 돕습니다.
수식 a = b + c의 처리 과정:
a, =, b, +, c 로 분리 =
/ \
a +
/ \
b c
LL 파서는 입력을 왼쪽에서 오른쪽으로 읽고, 왼쪽에서 오른쪽으로 유도식을 생성하는 파서입니다. 주로 재귀 하향식(Recursive Descent) 파서로 구현되며, 문법의 예측과 백트래킹 없이 작동합니다. LL 파서는 문법 규칙이 제한된 언어에 적합하며, 구현이 간단하고 이해하기 쉽습니다.
LR 파서는 입력을 왼쪽에서 오른쪽으로 읽고, 오른쪽에서 왼쪽으로 유도식을 생성하는 파서입니다. 주로 하향식(Shift-Reduce) 파서로 구현되며, 더 복잡한 문법을 처리할 수 있습니다. LR 파서는 문법 규칙이 복잡한 언어에 적합하며, SLR, LALR, Canonical LR과 같은 다양한 변형이 있습니다.
구현 복잡성:
처리 가능한 문법의 복잡성:
사용 예:
문서 객체 모델(DOM, Document Object Model)은 HTML이나 XML 문서를 계층적 트리 구조로 표현한 것입니다. DOM은 브라우저가 웹 페이지를 구조화하고, 자바스크립트를 통해 동적으로 변경할 수 있게 합니다.
DOM은 문서를 노드 트리로 표현합니다. 각 노드는 문서의 일부(요소, 속성, 텍스트 등)를 나타냅니다.
다음 HTML 문서를 DOM으로 표현:
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
DOM 트리:
#document
|-- html
|-- head
| |-- title
| |-- "Example"
|-- body
|-- h1
|-- "Hello, World!"
DOM Parser는 XML이나 HTML 문서를 파싱하여 DOM 트리를 생성하는 파서입니다. DOM 트리는 문서의 구조를 트리 형태로 표현하며, 각 노드는 문서의 일부를 나타냅니다.
다음 XML 문서를 DOM Parser로 파싱:
<book>
<title>XML Guide</title>
<author>John Doe</author>
</book>
DOM 트리:
#document
|-- book
|-- title
| |-- "XML Guide"
|-- author
|-- "John Doe"
트리 구조는 계층적 데이터를 직관적으로 표현할 수 있습니다. 노드 간의 부모-자식 관계를 명확하게 나타낼 수 있어 데이터의 구조와 의미를 쉽게 이해할 수 있습니다.
트리 구조를 사용하면 데이터 탐색 및 수정이 용이합니다. 재귀적으로 노드를 탐색하고, 원하는 노드를 쉽게 찾을 수 있습니다. 또한, 노드를 추가하거나 삭제하는 작업이 간단합니다.
트리 구조는 데이터의 삽입, 삭제, 검색 등의 작업을 효율적으로 수행할 수 있게 합니다. 특히, 이진 탐색 트리나 AVL 트리와 같은 특정 트리 구조를 사용하면 데이터 처리 성능을 크게 향상시킬 수 있습니다.
트리 구조는 다양한 분야에서 널리 사용됩니다. 예를 들어, 파일 시스템, 데이터베이스 인덱스, 컴파일러의 구문 분석, 웹 브라우저의 DOM 트리 등에서 트리 구조가 활용됩니다.
root
|-- home
| |-- user1
| | |-- file1.txt
| | |-- file2.txt
| |-- user2
| |-- file3.txt
|-- etc
|-- config.txt