Пока что мы рассматривали компилятор как "черный ящик", отображающий исходную программу в семантически эквивалентную ей целевую программу. Если мы немного приоткроем этот ящик, то увидим, что это отображение разделяется на две части: анализ и синтез.
Анализ
разбивает исходную программу на составные
части и накладывает на них грамматическую
структуру. Затем он использует эту
структуру для создания промежуточного
представления исходной программы. Если
анализ обнаруживает, что исходная
программа неверно составлена
синтаксически либо дефектна семантически, он должен
выдать информативные сообщения об этом,
чтобы пользователь мог исправить обнаруженные
ошибки. Анализ также собирает информацию
об исходной программе и сохраняет ее в
структуре данных, именуемой
таблицей символов, которая
передается вместе с промежуточным
представлением синтезу.
Синтез
строит требуемую целевую программу на
основе промежуточного представления и
информации из таблицы символов. Анализ
часто называют начальной стадией, а синтез
—
заключительной.