4.1. Общая характеристика семантического анализа

Формально процесс семантического анализа и синтеза объектной програм­мы реализует преобразование синтаксического дерева программы на входном языке в текст эквивалентной формы объектной программы. При этом синтак­сический анализ обычно чередуется с семантическим. Сначала синтаксичес­кий анализатор идентифицирует последовательность лексем, формируя синтаксическую единицу — выражение, оператор, вызов программы и т.д., за­тем распознанная синтаксическая единица (структура) обрабатывается семан­тическим анализатором.

Семантический анализатор обычно разделяется на ряд более мелких се­мантических анализаторов — семантических подпрограмм, каждая из кото­рых предназначается для обработки одного конкретного типа программной конструкции. Например, описания массивов могут обрабатываться одним ана­лизатором, арифметические выражения — другим, а оператор условного пере­хода — третьим и т.д.

Для простых трансляций результатом работы семантического анализа­тора может быть и объектная программа, но, как правило, выходом семанти­ческого анализатора является некоторая внутренняя форма выполняемой программы — промежуточная программа. При этом, обычно, промежуточная программа порождается по частям и поэтому, как правило, чрезвычайно неэф­фективна и требует проведения оптимизации прежде, чем по ней будет выпол­нятся генерация объектной программы.

Семантический анализатор наиболее зависимая от языка программиро­вания часть транслятора, поэтому подходы и способы построения семантичес­кого анализатора могут существенно отличаться для различных языков программирования. И все же практически для любого языка программирования во время семантического анализа необходимо реализовать следующие ос­новные функции:

· выполнить проверку семантических (контекстных)  условий в про­грамме;

· осуществить распределение памяти;

· провести синтез промежуточной (объектной) программы.

В качестве вспомогательной функции реализуется функция ведения табли­цы идентификаторов.