- 추상 구문 트리(AST)는 프로그램의 논리적 구조를 나타내며, 불필요한 구문적 세부 사항을 제거합니다.
- AST는 차수 함수가 있는 알파벳과 어떤 노드와 구조가 유효한지 정의하는 트리 문법으로 구성됩니다.
- 듀이 표기법과 "." 또는 "/"와 같은 연산자를 사용하면 이러한 구조 내의 하위 트리와 경로를 정확하게 참조할 수 있습니다.
- 컴파일러, 인터프리터 및 코드 분석 도구는 프로그램을 안정적으로 최적화, 변환 및 이해하기 위해 AST에 의존합니다.

프로그래밍에서 추상 구문 트리는 처음에는 매우 이론적인 개념 처럼 들리지만, 일단 익숙해지면 컴파일러, 인터프리터 , 코드 분석, 리팩토링 도구, 심지어 구조화된 데이터 쿼리 언어에 이르기까지 도처에 존재한다는 것을 깨닫게 됩니다. 본질적으로 추상 구문 트리는 기계가 일반 텍스트를 넘어 프로그램의 구조를 "이해하는" 방식입니다.
추상 구문 트리(AST)는 때때로 고전적인 구문 트리와 혼동되지만, 고유한 규칙을 가지고 있습니다. 추상 구문 트리는 단순히 보기 좋은 그림이 아니라, 구체적인 구문에서 불필요한 요소(괄호, 쉼표, 중복 키워드 등)를 제거하고 핵심적인 내용, 즉 어떤 연산이 어떤 값에 대해 어떤 순서로 수행되는지에 집중하는 간결하고 잘 설계된 데이터 구조입니다.
추상 구문 트리(AST)란 정확히 무엇인가요?
프로그래밍 언어 이론에서 추상 구문 트리(AST)는 프로그램의 구문을 나타내는 트리 형태의 구조이지만 , 구체적인 구문 분석 트리에 비해 단순화된 형태입니다. AST는 구문 분석 트리와 동일한 필수 정보를 포함하지만, 더 간결하고 관리하기 쉬운 방식으로 구성되어 있습니다.
구문 트리는 문법의 모든 생성 규칙 과 괄호, 쉼표, 세미콜론 및 기타 순수 구문적 요소를 포함한 모든 터미널 기호를 포함합니다. 반면, AST는 의미론적 의미에 기여하지 않는 이러한 세부 사항을 제거하고 표현식과 문장의 논리적 구조만 유지합니다.
구현 측면에서 AST는 일반적으로 어떤 종류의 구문 구조인지(상수, 식별자, 함수 적용, 이항 연산자 등)를 나타내는 유형 과 그 내용을 설명하는 추가 속성(값, 이름, 자식, 인자 목록 등)을 가진 노드 객체로 구성됩니다.
AST의 장점은 구문적 잡음 없이 프로그램 구조를 깔끔하게 보여주기 때문에 타입 검사, 최적화 또는 코드 생성 과 같은 컴파일러나 인터프리터의 후속 단계를 용이하게 한다는 점입니다.
구체 구문 트리와 추상 구문 트리의 차이점
AST가 어떤 역할을 하는지 완전히 이해하려면 먼저 구체적인 구문 트리 와 추상적인 구문 트리를 비교해 보는 것이 도움이 됩니다. "a + 4 * 5" 와 같은 산술 표현식을 인식하는 간단한 문법을 생각해 보세요 . 구체적인 구문 트리는 각 문법 규칙의 적용을 정확하게 반영합니다. 즉, 비단말 기호, 단말 기호, 괄호, 연산자 등을 나타냅니다.
이 특정 트리는 일반적으로 깊고, 문법의 형식적 구조를 유지하는 데에만 사용되는 많은 중간 노드를 가지고 있습니다. 예를 들어, "표현식", "용어", "인자"에 대한 노드와 "+" , "*" 와 같은 터미널 기호 , 식별자 및 숫자가 있을 수 있습니다. 각 생성 규칙은 트리의 가지가 되어 구조적 복잡성을 증가시킵니다.
반면에 동일한 표현식에 대한 추상 구문 트리는 실제 연산과 피연산자 만 나타내는 것으로 제한됩니다 . 따라서 여러 단계의 "표현식"과 "항" 대신, 덧셈을 나타내는 루트 노드와 두 개의 자식 노드를 가질 수 있습니다. 왼쪽에는 식별자 ' a'가, 오른쪽에는 곱셈 노드가 있으며, 곱셈 노드의 자식 노드는 각각 값 '4'와 '5'입니다. 순전히 문법적인 노드는 사라지고 구조의 일부는 재배열되거나 압축됩니다.
즉, AST와 구체적인 구문 트리는 동일한 의미 정보를 포함 하지만, AST는 이를 훨씬 더 직접적이고 간결한 형태로 표현합니다. 이러한 간결성은 분석 또는 실행 도구에서 코드를 효율적으로 다루는 데 핵심적인 요소입니다.
차수 함수를 사용하는 트리 및 알파벳
이러한 트리 구조를 수학적 관점에서 형식화하기 위해, 일반적으로 차수 함수를 갖는 알파벳 이라는 개념이 사용됩니다 . 단순히 기호들의 집합을 사용하는 대신, 각 기호에 트리에서 가질 수 있는 자식의 개수를 나타내는 숫자를 부여하는 알파벳을 정의합니다.
비공식적으로, 차수 함수를 갖는 알파벳은 유한한 기호 집합과 각 기호에 자연수(0 포함)를 할당하는 함수로 이루어진 쌍입니다. 이 숫자는 기호의 차수를 나타냅니다. 0이면 리프 노드처럼 동작하고, 1이면 단항 노드처럼 동작하며, 2이면 이항 노드처럼 동작하는 식입니다. 또한 연산자의 인자 목록에 가변 차수 기호를 허용하는 것도 일반적입니다.
차수가 0인 기호는 트리의 리프 노드 (예: 상수 또는 식별자)에 해당합니다. 차수가 1인 기호는 단일 자식 표현식을 포함하는 구조에 사용됩니다. 차수가 2인 기호는 덧셈, 곱셈, 대입 등과 같은 일반적인 이진 연산을 나타냅니다. 가변 차수 기호를 사용하면 여러 매개변수를 가진 함수 호출과 같이 불확정적인 수의 서브트리를 허용하는 구조를 모델링할 수 있습니다.
차수를 가진 이 알파벳으로부터 가능한 모든 트리의 집합을 정의할 수 있습니다. (만약 고려된다면) 빈 트리 에서 시작하여 차수가 0이고 가변적인 모든 기호를 추가하고, 귀납적으로 확장합니다. 즉, 어떤 기호가 k차수라면, 이미 구성된 k개의 서브트리의 부모 노드로 배치될 수 있습니다. 이렇게 하면 해당 알파벳과 관련된 트리 언어(또는 용어)가 생성됩니다.
트리 언어와 노드의 개념
알파벳과 그 차수 함수로 이루어진 모든 트리의 집합을 이 문맥에서는 트리 언어 또는 용어 언어 라고 부릅니다 . 이는 문자열에 대한 클레인 클로저와 마찬가지로 트리 구조에 대한 트리 언어입니다.
문자열을 분석할 때 시퀀스 내에서 알파벳 기호가 나타나는 횟수를 토큰 이라고 부르는 것처럼 , 트리를 다룰 때는 일반적으로 노드 라는 용어를 사용합니다 . 노드는 본질적으로 트리의 특정 위치에 있는, 특정 차수를 가진 알파벳 기호의 특정 발생을 의미합니다.
이러한 관점에서 볼 때, 트리 언어는 노드에 대해 문자열 집합이 토큰 발생에 대해 가지는 관계와 유사합니다. 각 트리는 알파벳에서 단계적으로 구축된 구조로 해석되며, 노드는 해당 구조의 기호를 물리적으로 구현하는 개별 구성 요소입니다.
이러한 관점은 파서와 AST 생성기를 설계할 때 매우 유용합니다 . 왜냐하면 문자열 문법과 유사한 방식으로 이러한 트리의 구성 규칙에 대해 추론할 수 있지만, 계층적 구조에서 직접 작업할 수 있기 때문입니다.
특정 AST에서 노드의 개수: Egg의 경우
이론에서 실제 예시로 넘어가면, 많은 교육 자료에서 AST(추상 구문 트리)의 구성과 조작을 설명하기 위해 Egg 언어를 사용합니다. 이 과정에서 몇 가지 주요 노드 유형이 사용되는데, 각 유형은 명확한 차수(arity)를 가지고 있어 조작이 매우 쉽습니다.
일반적인 Egg AST에서 VALUE 노드는 리프 노드로 간주됩니다. 이 노드는 문자열이나 숫자와 같은 리터럴을 나타냅니다. 자식 노드가 없으며 값만 저장합니다. 마찬가지로 식별자(변수 이름, 함수 이름 등)에 사용되는 WORD 노드 도 이름을 저장하는 속성을 가진 리프 노드로 취급됩니다.
Egg에서 핵심 노드는 함수 또는 연산자의 적용을 나타내는 APPLY 유형입니다. 이 노드 유형에는 두 개의 개념적 자식 노드가 있습니다. 하나는 적용되는 표현식을 가리키는 OPERATOR 자식 노드이고 , 다른 하나는 각 인수에 대한 서브트리 모음을 관리하는 역할을 하는 특수한 ARRAY 노드인 ARGS 자식 노드입니다.
따라서 배열은 AST에 가변 인자 개수를 도입하는 자연스러운 방법입니다 . APPLY는 항상 두 가지 구성 요소(연산자와 인자 목록)를 가지지만, 내부 목록은 표현되는 특정 호출에 따라 0개, 1개 또는 여러 개의 하위 트리를 포함할 수 있습니다.
Egg에서 AST 노드의 상세한 해부학적 구조
구현 수준에서 Egg의 AST 노드는 일반적으로 속성을 가진 객체 로 표현되며 , 이는 JavaScript와 같은 언어에 완벽하게 적합합니다. 모든 노드는 공통 속성인 `type`을 공유하며 , 이 속성은 노드 유형(VALUE, WORD, APPLY, ARRAY 등)을 식별하고, 따라서 객체의 나머지 부분이 갖게 될 구조를 결정합니다.
VALUE 노드는 리터럴 상수를 나타내는 데 사용됩니다 . 이 노드는 종종 'value' 라고 불리는 속성을 가지며 , 이 속성에는 해당 상수가 나타내는 숫자 또는 문자열이 저장됩니다. VALUE 노드는 내용이 해당 리터럴 자체로 완전히 설명되므로 추가적인 자식 노드를 가지지 않습니다.
워드 노드는 변수 이름, 함수 이름, 매개변수 이름 등과 같은 식별자를 위해 예약되어 있습니다 . 일반적으로 워드 노드는 식별자를 문자열로 저장하는 `name` 속성을 가지고 있습니다 . VALUE 노드와 마찬가지로, 워드 노드는 트리의 리프 노드 역할을 하며, 그 유일한 목적은 해당 이름을 제공하는 것입니다.
적용 노드는 응용 프로그램 또는 호출을 나타냅니다. 이러한 노드에는 적용되는 표현식(다른 노드)을 가리키는 연산자 속성과 배열 노드에 연결되는 인수 속성이 포함됩니다. 후자는 AST 내의 특정 노드로, 응용 프로그램의 인수 목록을 저장하는 역할을 합니다 .
ARRAY 노드는 다른 노드를 담는 구조화된 컨테이너로, 서브트리들의 시퀀스를 나타냅니다. 인자 개수 측면에서 볼 때, ARRAY 노드는 메인 노드 유형의 정의를 변경하지 않고도 동일한 APPLY 문 내에서 인자 없이, 인자 하나만으로, 또는 인자 여러 개를 사용하여 호출할 수 있도록 유연성을 제공합니다.
AST 예시: 하나의 값을 사용하는 간단한 응용 프로그램
위의 내용을 시각화하기 위해, 단일 인자 5를 받는 함수 X의 적용과 같은 간단한 명령어의 표현을 생각해 보겠습니다. 파서가 생성하는 AST는 Egg의 규칙에 따라 VALUE, WORD, APPLY 노드로 구성된 항 에 해당합니다.
개념적으로 설명하자면, 루트에는 APPLY 노드가 있습니다 . 이 노드의 operator 속성은 X라는 이름의 WORD 노드를 가리키고, args 속성은 단일 요소(숫자 값 5를 가진 VALUE 노드)를 포함하는 ARRAY 노드를 참조합니다. 이처럼 구조는 적용 대상과 적용 방식을 명확하게 보여줍니다.
모든 속성을 명시적으로 표현하고 싶다면, 타입, 연산자, 인자, 이름, 값 등을 보여주는 더 자세한 표기법을 사용할 수 있습니다. 이처럼 자세한 표기법은 파서를 디버깅하거나 텍스트 표현식이 인터프리터 내에서 트리 객체로 어떻게 변환되는지 이해하는 데 매우 유용합니다.
실제 구현에서는 이러한 AST(추상 구문 트리)를 쉽게 저장, 전송 또는 검사할 수 있도록 JSON 형식으로 직렬화하는 것이 일반적입니다 . 실제로 npm 생태계의 evm2term 패키지와 같은 도구 및 모듈은 이러한 AST를 간결하게 표현하여 분석이나 변환을 용이하게 해줍니다.
AST 예시: 중첩된 덧셈과 곱셈
또 다른 일반적인 경우는 "+(a, *(4, 5))" 와 같이 약간 더 복잡한 표현식입니다 . 여기서 첫 번째 인수는 식별자 a이고 두 번째 인수는 4와 5를 곱한 결과인 덧셈 연산이 있습니다. 이 표현식에서 생성되는 AST는 이러한 중첩 구조를 반영합니다.
트리의 루트에는 덧셈 연산을 나타내는 APPLY 노드가 다시 나타납니다. 연산자는 "+"라는 이름의 WORD 노드이고, 인수는 두 개의 요소를 가진 ARRAY 노드에 저장됩니다. 첫 번째 요소는 "a"라는 이름의 WORD 노드이고, 두 번째 요소는 곱셈을 나타내는 또 다른 APPLY 노드입니다.
두 번째 APPLY 연산자는 "*"라는 이름의 WORD이고, 인수는 두 개의 VALUE 노드(하나는 값 4, 다른 하나는 값 5)를 가진 ARRAY입니다. 전체 구조를 보면, 평가 순서는 4에 5를 곱한 다음 그 결과를 a에 더하는 것임을 분명히 알 수 있습니다.
표기법을 확장하여 모든 속성을 포함시키면 모든 노드의 유형, 이름 또는 특정 값, 그리고 노드 간의 관계를 확인할 수 있습니다. 이러한 명시적인 설명은 Egg 인터프리터의 실제 구현과 일치하며, 여기서 각 노드는 앞서 언급한 속성을 가진 객체입니다.
트리 문법과 파서 문법
이러한 AST가 생성되는 방식은 임의적인 것이 아니라, 트리 문법(Tree Grammar) 이라는 것에 기반합니다 . 일반적인 공식에서 이러한 문법은 차수가 있는 알파벳, 유한한 구문 변수(비단말 기호) 집합, 유한한 생성 규칙 집합, 그리고 시작 기호로 구성된 네 가지 요소로 정의됩니다.
각 생성 규칙에서 변수는 루트가 특정 차수를 가진 알파벳 기호이고 자식이 변수 또는 이미 정의된 트리인 트리로 대체됩니다. 이러한 구조는 고전적인 정규 문법이나 문맥 자유 문법을 연상시키지만, 기호 문자열 대신 트리를 직접 생성하는 데 적합합니다.
보다 형식적인 정의와 관련하여 Egg 파서가 트리를 생성하는 데 사용하는 특정 문법이 있습니다. 일반적으로 문서에 비공식적으로 제시되는 이 문법은 키워드, 연산자, 괄호 등의 어떤 조합이 언어에서 허용되는지, 그리고 이러한 조합이 VALUE, WORD, APPLY, ARRAY 유형의 노드로 어떻게 변환되는지를 정확하게 설명합니다.
이 트리 문법은 문헌에서 정규 트리 문법(Regular Tree Grammar) 으로 알려진 것의 특수한 경우로 볼 수 있습니다 . 핵심 아이디어는 입력 토큰 시퀀스를 해석 또는 컴파일 가능한 구조화된 AST로 변환하기 위한 잘 정의된 규칙을 갖는 것입니다.
듀이 표기법: 트리 내의 좌표
AST를 얻은 후에는 종종 특정 서브트리를 참조해야 합니다 . 예를 들어 함수의 두 번째 인자, 표현식의 연산자 등을 참조해야 할 때가 있습니다. 이를 위한 매우 효율적인 방법은 문서에서 섹션과 하위 섹션에 번호를 매기는 데 사용되는 체계를 차용한 소위 듀이 십진 분류법입니다.
이 표기법에서 트리 t를 시작으로, 서브트리는 마침표로 구분된 숫자열 로 표시됩니다 . 각 숫자는 자식 노드의 위치(일반적으로 1부터 시작)를 나타내며, 이 순서는 트리를 따라 아래로 이어집니다. 따라서 t/2.1.3과 같은 표현은 트리 t의 두 번째 자식 노드의 첫 번째 자식 노드의 세 번째 자식 노드를 가리킵니다.
이 표기법의 귀납적 정의는 간단합니다. 빈 문자열은 전체 트리를 나타냅니다. 문자열이 마침표로 구분된 숫자와 그 뒤에 오는 숫자들로 구성된 경우, 먼저 표시된 인덱스에 해당하는 자식 서브트리를 가져온 다음, 동일한 논리를 문자열의 나머지 부분에 재귀적으로 적용하여 해석합니다.
예를 들어, 루트 노드가 덧셈을 나타내는 APPLY이고, 자식 노드 중에 "+"라는 이름의 WORD와 곱셈을 나타내는 또 다른 APPLY가 있는 "+(a, *(4,5))"와 같은 표현식을 나타내는 트리 t가 있다고 가정해 보겠습니다. 이 경우 특정 위치를 식별할 수 있습니다. 따라서 자식 노드에 적절한 번호를 매기면 t/1 은 연산자 "+"를 가진 WORD 노드, t/2.1은 식별자 "a", t/2.2.2.1은 값 4를 가진 VALUE 노드가 될 수 있습니다.
이처럼 AST 내에서 "좌표"를 제공하는 방식은 오류를 보고하거나, 트리를 탐색 하거나, 특정 노드에 로컬 변환을 적용할 때 모호함 없이 특정 위치를 지정하는 데 매우 유용합니다.
프로그래밍 및 도구에서의 동등한 표기법
듀이 표기법의 기본 아이디어는 트리 이론에만 국한된 것이 아닙니다. 사실, 우리가 프로그래밍이나 구조화된 데이터 처리에서 매일 사용하는 많은 실용적인 표기법에서 반복적으로 나타나는데 , 비록 우리가 항상 그것을 의식하지는 못하더라도 말입니다.
프로그래밍 언어에서 점 연산자(.)를 사용하여 object.property.subproperty와 같은 표현식을 작성할 때, 우리는 매우 유사한 작업을 수행합니다. 즉, 중첩된 객체 트리를 순회하면서 위치 번호가 아닌 이름으로 각 단계에서 자식 노드를 선택하는 것입니다. 루트 노드에서 시작하여 더 내부적인 노드로 내려가는 방식입니다.
유닉스 계열 파일 시스템에서도 동일한 패턴이 나타나는데, 여기서는 슬래시 연산자(/)가 디렉터리를 구분하는 데 사용됩니다. 예를 들어, /src/js/tutu.js는 파일 시스템의 루트에서 특정 리소스까지의 경로를 나타내며, 트리 구조의 여러 단계를 순차적으로 거칩니다.
구조화된 문서 세계에서 XPath 와 같은 언어는 XML 트리 내의 노드를 선택하기 위해 매우 유사한 표기법을 사용합니다. "A//B/*"와 같은 쿼리는 현재 컨텍스트를 기준으로 적절한 위치에 있는 요소 A의 자손인 모든 요소 B의 첫 번째 자식(이름은 관계없음)을 선택하며, 단일 및 이중 슬래시를 사용하여 트리의 깊이를 나타냅니다.
또 다른 잘 알려진 도구인 jq 언어 는 병렬 시스템을 사용하여 JSON 구조를 탐색하고, 복합 경로, 필터 및 표현식을 통해 하위 객체를 선택할 수 있도록 합니다. 이러한 모든 표기법은 트리 구조에서 경로를 표현하는 다양한 방식이며 , 듀이 십진 분류법과 매우 유사하지만 각 영역에 맞게 조정된 것입니다.
언어학과 프로그래밍에서의 구문 트리
컴파일러 분야를 넘어, 구문 트리는 언어학에서도 문장 구조를 나타내는 데 사용됩니다. 언어학에서는 이를 파생 트리 또는 구문 분석 트리라고 부르며, 문장이 어떻게 구, 단어, 문법 범주로 분해되는지를 보여줍니다.
프로그래밍에서와 마찬가지로 이러한 트리에는 세 가지 기본 유형의 노드가 있습니다. 전체 문장 또는 전체 구조를 나타내는 루트 노드 , 부모 노드 역할을 하며 문장의 하위 집합을 그룹화하는 내부 또는 분기 노드, 그리고 일반적으로 입력 문자열에 나타나는 특정 단어에 해당하는 리프 노드입니다.
루트 노드는 유일무이하며, 전체 트리 구조가 이 루트 노드를 중심으로 형성됩니다. 분기 노드는 루트 노드 또는 다른 상위 노드 바로 아래에 위치하며, 문장이나 프로그램의 각 부분을 계층적으로 구성하는 역할을 합니다 . 반면, 리프 노드는 트리의 최하위에 있으며 자식 노드가 없어 분기 구조를 닫습니다.
이러한 트리 구조는 복잡한 문장을 이해하기 쉬운 요소로 분해하는 데 도움이 되기 때문에 강력한 교육 도구로 여겨집니다. 프로그래밍에서도 마찬가지입니다. 잘 구성된 AST를 사용하면 어떤 연산들이 연결되어 있는지, 어떤 표현식들이 중첩되어 있는지, 그리고 평가 과정이 어떻게 진행되는지 한눈에 파악할 수 있습니다.
분석 목적에 따라 다양한 유형의 분석 트리를 찾아볼 수 있습니다 . 어떤 트리는 단어나 구성 요소 간의 의존 관계(예: 문장에서 누가 누구에게 의존하는지)를 강조하는 반면, 다른 트리는 구 또는 구성 요소로 그룹화하는 데 초점을 맞추어 크게 두 가지 유형으로 나눌 수 있습니다.
의존 관계별 및 구성 요소별 구문 트리
가장 잘 알려진 유형 중 하나는 의존 관계 기반 구문 트리 입니다 . 이 변형에서는 문장의 모든 단어 또는 모든 관련 요소가 리프 노드로 취급되고, 이들 사이의 연결은 직접적인 의존 관계(예: 주동사와 주어)를 나타냅니다. 결과적으로 다른 방식보다 노드 수가 적은 트리가 생성되는 경우가 많습니다.
이러한 단순함 덕분에 초보자나 특정 언어 처리 작업에 특히 편리합니다. 중간 노드를 많이 도입하지 않고 누가 누구에게 의존하는지 에 초점을 맞추기 때문입니다 . 프로그래밍에 적용하면, 문법적 장식을 생략하고 필수적인 관계에만 집중하는 것이 핵심 아이디어입니다.
반대로, 구문 트리는 구성 요소 또는 구성 단위를 기반으로 하며 , 루트 노드, 내부 분기 노드 및 리프 노드를 구분하고 모든 관련 그룹을 명확하게 보여줍니다. 이러한 트리는 일반적으로 더 많은 노드를 포함하고 문장이나 프로그램의 계층 구조를 더욱 상세하게 반영합니다.
일반적으로 볼 수 있는 구성 트리 템플릿은 여러 개의 리프 노드, 여러 단계의 분기, 그리고 명확하게 정의된 루트 노드를 가진 긴 문장을 보여줍니다. 이러한 템플릿은 특히 중첩 구조가 복잡한 문장이나 프로그램을 분석하는 데 유용합니다.
의존 관계 트리와 구성 관계 트리 모두에서 예시 및 시각적 자료가 템플릿 형태로 제공되므로 원하는 정보로 노드를 간단히 채워 넣기만 하면 됩니다. 이를 통해 시간을 절약하고 구조를 시각화할 때마다 다이어그램을 처음부터 다시 디자인해야 하는 번거로움을 피할 수 있습니다.
AST 관련 실제 응용 사례 및 도구
AST는 단순히 이론적인 개념이 아닙니다. 코드를 다루는 사람이라면 누구나 사용하는 수많은 일상적인 도구 에서 실제로 활용되고 있습니다 . 컴파일러, 인터프리터, 코드 축소 도구, 코드 포맷터, 정적 분석기 등은 거의 항상 AST를 기반으로 작동합니다.
일반적인 컴파일러는 소스 코드를 입력받아 토큰화하고, 구문 분석하여 추상 구문 트리(AST)를 생성합니다. 그 후, 의미론적 검사(타입, 변수 범위, 구문의 잘못된 사용 등)를 수행하고, AST를 순회하고 변환하여 코드 최적화를 적용한 다음 기계어 코드, 즉 바이트코드를 생성합니다.
린터나 포맷터 같은 도구들도 AST에서 작동합니다. 이러한 도구들은 구조를 분석하여 문제가 있는 패턴, 잘못된 관행 또는 불일치를 감지하고, 트리의 의미 구조는 유지하면서 코드의 표현 방식을 조정하는 변경 사항을 제안합니다.
예를 들어 자바스크립트 생태계에는 AST를 JSON 형식으로 제공하는 여러 라이브러리가 있어 다른 도구들이 이를 활용하여 리팩토링을 수행하거나, 자동 문서를 생성하거나, 복잡한 프로그램 구조를 시각화하는 것이 더 쉬워집니다.
테스트 커버리지 측정을 위한 계측이나 소스 코드를 다른 언어로 변환하는 것과 같은 다소 전문적인 영역에서도 AST는 많은 최신 솔루션의 기반이 됩니다. AST를 사용하면 원시 텍스트와 기계어 코드 사이에서 매우 편안한 수준의 추상화를 통해 작업할 수 있기 때문입니다.
종합적으로 볼 때, 추상 구문 트리는 언어의 형식 문법, 컴파일러나 인터프리터 내부의 표현 방식, 그리고 코드를 안전하고 효율적으로 작성, 분석, 변환하는 데 사용하는 고급 도구들을 연결하는 핵심 요소입니다. 추상 구문 트리가 어떻게 구성되는지, 듀이 십진 분류법과 같은 개념을 사용하여 어떻게 탐색하는지, 그리고 어떤 유형의 노드(VALUE, WORD, APPLY, 고정 또는 가변 인자 구조 등)가 사용되는지 이해하면 기계가 프로그램을 처리할 때 실제로 무엇을 하는지 훨씬 더 명확하게 파악할 수 있습니다.

