Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700383.doc
Скачиваний:
15
Добавлен:
01.05.2022
Размер:
4.33 Mб
Скачать

9.2. Таблицы идентификаторов. Организация таблиц идентификаторов

9.2.1. Назначение таблиц идентификаторов

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

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

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

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

Имя каждого элемента должно быть уникальным. Многие современные языки программирования допускают совпадения (неуникальность) имен переменных и функций в зависимости от их области видимости и других условий исходной программы. В этом случае уникальность имен должен обеспечивать сам компилятор.

Рассмотрим, что происходит с идентификаторами на различных фазах трансляции (табл. 16).

Таблица 16

Действия с идентификатором на различных фазах трансляции

Фаза компиляции

Действие с идентификатором

1. Лексический анализ

выделение

2. Синтаксический разбор

определение характеристик

3. Семантиче­ский анализ

4. Подготовка к генерации кода

Компилятор должен иметь возможность хранить все найденные идентификаторы и связанные с ними характеристики в течение всего процесса компиляции.

В компиляторах используются специальные хранилища данных, называемые таблицами идентификаторов.

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

Состав информации, хранимой в таблице идентификаторов для каждого элемента исходной программы, зависит от семантики входного языка и типа элемента.

Например, в таблицах идентификаторов может храниться следующая информация:

для переменных:

  • имя переменной;

  • тип данных переменной;

  • область памяти, связанная с переменной;

для констант:

  • название константы (если оно имеется);

  • значение константы;

  • тип данных константы (если требуется);

для функций:

  • имя функции;

  • количество и типы формальных аргументов функции;

  • тип возвращаемого результата;

  • адрес кода функции.

Приведенный выше состав хранимой информации, является только примерным. Конкретное наполнение таблиц идентификаторов зависит от реализации компилятора.

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

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

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