Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы СПО-2.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
185 Кб
Скачать
☆

Этапы семантического анализа

Семантический анализатор выполняет следующие основные действия:

1) проверку соблюдения во входной программе семантических соглашений входного языка;

2) дополнение внутреннего представления программы в компиляторе операторами и действиями, неявно предусмотренными семантикой входного языка;

3) проверку элементарных семантических (смысловых) норм языков программирования, напрямую не связанных со входным языком.

Результаты выполнения синтаксического анализа могут быть представлены в одной из форм внутреннего представления программы в компиляторе. Как правило, с на этапе семантического анализа используются различные варианты синтаксических деревьев, построенных в результате синтаксического разбора, поскольку семантический анализатор интересует прежде всего структура исходной программы.

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

10. Генератор кода. Распределение памяти. Принципы распределения памяти. Дисплей памяти процедуры (функции).

Распределение памяти — это процесс, который ставит в соответствие лексическим единицам исходной программы адрес, размер и атрибуты области памяти, необходимой для этой лексической единицы.

Область памяти — это блок ячеек памяти, выделяемый для данных, каким-то образом объединенных логически. Логика таких объединений задается семантикой исходного языка.

Процесс распределения памяти в современных компиляторах, как правило, работает с относительными, а не абсолютными адресами ячеек памяти. Распределение памяти выполняется перед генерацией кода

результирующей программы, потому что его результаты должны быть использованы в процессе генерации кода.

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

По роли области памяти в результирующей программе она бывает глобальная

или локальная.

По способам распределения область памяти бывает статическая или динамическая.

Дисплей памяти процедуры (функции) — это область данных, доступных для об-

работки в этой процедуре (функции).

Как правило, дисплей памяти процедуры включает следующие составляющие:

1)глобальные данные (переменные и константы) всей программы;

2) формальные аргументы процедуры;

3) локальные данные (переменные и константы) данной процедуры.

Также в дисплей памяти часто включают адрес возврата.

Адрес возврата — это адрес того фрагмента кода результирующей программы,

куда должно быть передано управление после того, как завершится выполнение

вызванной процедуры или функции. Фактически, адрес возврата — это адрес ма-

шинной команды, следующей за командой обращения (вызова) к процедуре или

функции.

11. Генератор кода. Генерация кода. Методы генерации кода. Общие принципы генерации кода.