Компиляторы. Семантический анализ.
Контекстно-свободные грамматики, с помощью которых описывают языки программирования, не позволяют задавать контекстные условия, имеющиеся в любом языке.
К контекстным условиям относятся:
1. каждый используемый в программе идентификатор должен быть описан, но не более одного раза в одной зоне описания;
2. при вызове функции число фактических параметров и их типы должны соответствовать числу типов формальных параметров;
3. обычно в языке накладываются ограничения на типы операндов любой операции, определенной в этом языке; на типы левой и правой частей в операторе присваивания, на тип параметра цикла, на тип условия в операторе цикла и условном операторе.
Проверку контекстных условий часто называют семантическим анализом. Его можно выполнить сразу после синтаксического анализа. Некоторые требования можно контролировать во время итерации кода (ограничения на типы операторов в выражении), а можно совместить синтаксический анализ с семантическим.
На этапе семантического анализа обрабатываются структуры, распознанные синтаксическим анализатором. На этой стадии выполняются и такие функции, как ведение таблицы символов, обнаружение ошибок, макрорасширений и выполнение инструкций, относящихся ко времени компиляции.
При простых трансляциях семантический анализатор может породить объектный код. Но обычно выходом этой стадии служит некоторая внутренняя форма выполняемой программы, с которой затем компилятор работает на стадии оптимизации.
Обычно семантический анализатор разделяется на ряд более мелких анализаторов, каждый из которых предназначен для конкретной программной конструкции. Например, описание массива обрабатываются одним анализатором, а арифметические выражения - другим. Соответствующий семантический анализатор вызывается синтаксическим анализатором как только синтаксический анализатор распознает синтаксическую единицу, требующую обработки.
Семантические анализаторы взаимодействуют между собой посредством информации, хранящейся в различных структурах данных, в частности в центральной таблице символов. Например, семантический анализатор, обрабатывающий описание типа для простых переменных не делает ничего, кроме занесения описываемых типов в таблицу символов. Позже семантический анализатор, обрабатывающий арифметические выражения может использовать описанные типы для включения соответствующих специфичных типов арифметических операций в объектный код.
Основные функции семантического анализатора, кроме ведения таблиц символов является:
1. включение неявной информации, т.е. информация, задаваемая в программе неявно, должна быть представлена в явном виде в программе низкого уровня;
2. обнаружение ошибок и макрообработка.
Дата добавления: 2015-07-30; просмотров: 927;