Что такое абстрактное синтаксическое дерево/нужно ли оно?

Я интересовался дизайном/реализацией компилятора/интерпретатора с тех пор, как я программировал (всего 5 лет ), и это всегда казалось «волшебством» за кулисами, о котором никто на самом деле не говорит (Я знаю как минимум 2 форума по разработке операционных систем, но я не знаю ни одного сообщества по разработке компиляторов/интерпретаторов/языков ). В любом случае, недавно я решил начать работать самостоятельно, в надежде расширить свои знания о программировании в целом (и, эй, это довольно весело :). Итак, основываясь на ограниченном количестве материалов для чтения, которые у меня есть, и на Википедии, я разработал эту концепцию компонентов для компилятора/интерпретатора:

Исходный код -> Лексический анализ -> Абстрактное синтаксическое дерево -> Синтаксический анализ -> Семантический анализ -> Генерация кода -> Исполняемый код.

(Я знаю, что есть еще генерация кода и исполняемый код, но я еще не зашел так далеко :)

. И с этим знанием,Я создал очень простой лексер (на Java )для получения входных данных из исходного файла и вывода токенов в другой файл. Пример ввода/вывода будет выглядеть следующим образом:

Вход:

int a := 2
if(a = 3) then
    print "Yay!"
endif

Вывод (из лексера):

INTEGER
A
ASSIGN
2
IF
L_PAR
A
COMP
3
R_PAR
THEN
PRINT
YAY!
ENDIF

Лично я думаю, что было бы очень легко перейти от этого к синтаксическому/семантическому анализу и, возможно, даже к генерации кода, что приводит меня к вопросу :Зачем использовать AST, когда кажется, что мой лексер работает так же хорошо, как и работа? Тем не менее, 100% моих источников, которые я использую для исследования этой темы, кажутся непреклонными в том, что это необходимая часть любого компилятора/интерпретатора. Я упускаю суть того, чем на самом деле является AST (деревом, показывающим логический поток программы )?

TL;DR :В настоящее время разрабатывается компилятор, завершен лексер, мне кажется, что вывод упростит синтаксический анализ/семантический анализ, а не выполнение AST. Так зачем использовать один? Я упускаю суть одного?

Спасибо!

8
задан centip3de 10 August 2012 в 01:35
поделиться