Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования методов трансляции.-1.pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.36 Mб
Скачать

189

Есть много других вариантов избежать перехеширования при создании таблиц идентификаторов. Рассмотрим некоторые из них.

·Сцепление элементов. В этом случае переполнения таблиц можно

избежать путем использования указателей (рис. 7.1.)

AGE

BAT

CAT

 

COW

 

 

 

CASE

 

 

Рис. 7.1. Сцепление элементов

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

·Бинарное дерево. Бинарное дерево (рис. 7.2.) состоит из некоторого количества вершин, каждая из которых содержит идентификатор, его тип и т.д., и двух указателей на другие вершины.

 

 

 

 

 

 

 

 

LEMON

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

EGG

 

 

 

 

 

 

MOUSE

 

 

 

 

 

 

 

 

 

 

 

 

 

BUS

 

 

 

 

 

HADDOCK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7.2. Бинарное дерево

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

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

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

8.3. Таблица видов

190

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

Всуществующих языках существует 5-7 вариантов видов:

1)основные виды, например int, real, char, bool и др.;

2)длинные и короткие виды, которые содержат символы long или short, появляющиеся перед основными видами;

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

4)структурные виды, типа struct и последовательностью полей; каждое поле имеет вид и селектор, обычно заключенные в скобки;

5)виды массивов;

6)объединенные виды, состоящие из символовunion или void, используемых для выражения значений, которые могут принадлежать нескольким видам;

7)виды процедур, представленные символами procedure, function и др., используемых для выражения значений, являющихся

процедурами.

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

Описатель

proc(real, int) bool,

выражающий значение вида«процедура-с-вещественными-и- целочисленными-параметрами-дающая-логический-результат» может быть представлена структурой с отдельными указателями на список параметров и результат (рис. 7.3).

proc

 

 

 

Real

 

 

int

 

bool

Рис. 7.3. Структура процедуры

Аналогичным образом вид

struct(int(i), struct(int j, bool y), real r)