регистров показано диаграммой на рис. 20.9.
V5 ├─────────────────┤
V4 ├────── ─ ─ ─ ─ ─ ──┤
V3 ├───────────────┼──────────────────┤
V2 ├─────┼─────┼────────┤
V1 ├──────────── ─ ─ ─ ─ ─ ─ ──┤
1 2 3 4 5 6 7 8 9 10 11 12 13
Рис. 20.9 Диаграмма использования переменных Vi в последова-
тельности команд, поясняющая работу алгоритма Биледи
4. ТАБЛИЦА СИМВОЛОВ
4.1 Описатели
Для каждого вхождения идентификатора в исх. программе осу-
ществляется поиск соотв. элемента в таблице символов (ТС), инфор-
мация, полученная при данном вхождении, сопоставляется с ранее
полученной информацией, выполняется необходимый контроль и регис-
трация новой информации. Таким образом, ТС является очень важной
частью компилятора и, в некотором смысле, узловой точкой всей
трансляции. Ее структура должна допускать эффективный поиск и
внесение информации. В то же время, каждый элемент должен зани-
мать как можно меньше места, для того, чтобы хватало места на
большие программы с большим числом идентификаторов. Вообще гово-
ря, желательно, чтобы возможно меньшее число программ транслято-
ра непосредственно работало с ТС. Это позволит достаточно легко
вносить необходимые изменения. Особенно важно тщательно согласо-
вать формат описателя до того, как начнется программирование
транслятора.
ОПИСАТЕЛЕМ называется часть элемента ТС, в которой описы-
вается идентификатор. Существует другой термин для обозначения
этого же понятия, введенный Фельдманом - "семантическое слово" (У
Ахо и Ульмана это назывется "дескриптором").
Количество информации, которое нужно хранить в описателе,
зависит от того, чем является фактически идентификатор - простой
переменной, массивом, функцией и т.д. Поэтому в некоторых реали-
зацих описатели имеют переменную длину. Это допустимо не при лю-
бой организации ТС. Иногда в целях экономии памяти выбирают эле-
мент ТС малого размера, а для идентификаторов, требующих больше
места, отводят по несколько соседних элементов.
Другая возможность открывается, емли в нужных случаях отво-
дить часть описателя под указатель, ссылающийся на дополни-
тельную таблицу. Это несколько осложняет программирование, пос-
кольку тип описателя может менять свой смысл в зависимости от ти-
па элемента.
4.2 Возможные параметры описания переменных и процедур
в таблице символов
Для переменных и процедур в описателе может потребоваться
следующая информация:
ПЕРЕМЕННАЯ:
Тип (вещ., целый, строка, комплексный, метка и т.д.);
Точность, масштаб, длина;
Вид (простая переменная, массив, структура и т.д.);
Адрес во время выполнения программы;
Если массив, то - число измерений. Если есть граничные пары
(ограниченные множества в Паскале), то их значения;
Если структура или компонента структуры, то связь данной
компоненты с другими компонентами;
Формальный параметр или нет; если да, то тип соответствия
параметров;
Описана ли переменная как extern или как идентификатор объе-
динения (union) ?
Обрабатывалось ли уже ее описание ?
Существует ли инструкция, присваивающая ей значение ?
ПРОЦЕДУРА:
Является ли она внешней по отношению к программе ?
Является ли она функцией ?
Каков ее тип ?
Обрабатывалось ли уже ее описание ?
Является ли она рекурсивной ?
Каковы ее формальные параметры ? Их описатели должны быть
связаны с именем функции для того, чтобы можно было проверить их
соответствие фактическим параметрам.
4.3 Таблица символов компилятора /360 WATFOR
/360 WATFOR - однопроходной компилятор с языка ФОРТРАН IV
для машин IBM/360.
ТС состоит из пяти разных списков:
- списка меток;
- списка арифметических констант;
- списка имен общих блоков, подпрограмм, переменных;
- списка блоков;
- списка подпрограмм.
(Таким образом, некоторые элементы оказываются в двух списках.)
Элементы всех списков помещаются в одной и той же таблице;
первые 2 байта каждого элемента используются для ссылки на сле-
дующий элемент в этом же списке. Следовательно, поиск отдельного
элемента сводится к линейному просмотру по ссылкам.
Элементы различных типов имеют разлмчную длину в пределах от
8 до 20 байтов.
Например, элемент для переменной имеют длину 16 байтов и со-
держит следующую информацию (первые 2 байта опущены):
3-4 5-10 11-12 13-14 15-16
┌────┬───────┬───────────┬──────┬───────────┐
│ B2 │идент-р│размерность│COMMON│EQUIVALENCE│
└────┴───────┴───────────┴──────┴───────────┘
В полях "COMMON" и "EQUIVALENCE" помещаются указатели на
элементы других переменных, связанных с данной при помощи ин-
струкций COMMON и EQUIVALENCE.
В поле "размерность" содержится 0, если переменная не яв-
ляется массивом; в противном случае оно указывает на отдельный
элемент, содержащий всю информацию о размерности: величины
d1,...,dn и длину d1*...*dn.
Два байта, обозначенные B2, содержат всю остальную информа-
цию (см. рис. 20.10). Первоначально все поля содержат нули, и в
них заносится информация по мере обработки программы.
Единица в каждом однобитовом поле на рис. 20.10 говорит о
наличии соответствующего факта.
│ 0-1 │ 2-4 │ 5-6 │ 7 │ 8 │ 9 │
├───────────┼────────┼──────────┼────────┼───────┼─────────┤
│10 - прос- │число │ тип │ длина │ тип │исполь- │
│ тая │индексов│00 - лог. │задается│сформи-│зование │
│ перем.│в случае│01 - цел. │програм-│рован │сформиро-│
│11 - массив│массива │10 - вещ. │мистом │ │вано │
│ │ │11 - ком- │ │ │ │
│ │ │ плекс. │ │ │ │
│ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │
├─────────┼────────┼─────────┼────────┼────────┼───────────┤
│формаль- │текущий │присваи- │имеет │встреча-│встреча- │
│ный пара-│параметр│вается │нач. │ется в │ется в │
│метр │цикла │значение │значение│COMMON │EQUIVALENCE│
│програм- │ │по ASSIGN│ │ │ │
│мы │ │ │ │ │ │
Рис. 20.10 Схема подполей поля B2
4.4 Представление структур в таблице символов
Мы можем представлять структуру, отводя по одному элементу
для каждой компоненты. Кроме обычных полей, каждый элемент имеет
три дополнительных поля: FATHER, SON и BROTHER.
Поле FATHER указывает на ОТЦА, SON - на первого СЫНА компо-
ненты, а поле BROTHER - на ее следующего БРАТА в последова-
тельности братьев группы.
Если данный элемент не имеет отца, сына или следующего бра-
та, то соответствующее поле будет содержать 0.
Ниже на рис. 20.11 приведены иерархические схемы строения
двух структур с указанием перед идентификатором каждой из
(под)компонент уровня ее вложенности.
1 A 1 L
2 B 2 M
3 C 4 C
3 D 4 D
2 E 2 B
2 F 5 C
5 D
Рис. 20.11 Схема построения двух структур
Элементы ТС для этих двух структур приведены ниже на Табли-
це 20.1. Этой информации может хватить с избытком (а может ока-
заться и недостаточно) для эффективной работы со структурами.
Поскольку могут существовать элементы, имена которых совпа-
дают, вводится еще один указатель SAME, связывающий такие элемен-
ты между собой. Первый из этих элементов содержит в этом поле 0.
Таблица 20.1 Схема заполнения элементов ТС для двух струк-
тур на рис. 20.11
┌────┬───┬─────┬──────┬────┬───────┐
│ │ID │ SAME│FATHER│ SON│BROTHER│
├────┼───┼─────┼──────┼────┼───────┤
│ A1 │ A │ 0 │ 0 │ B1 │ 0 │
│ B1 │ B │ 0 │ A1 │ C1 │ E1 │
│ C1 │ C │ 0 │ B1 │ 0 │ D1 │
│ D1 │ D │ 0 │ B1 │ 0 │ 0 │
│ E1 │ E │ 0 │ A1 │ 0 │ F1 │
│ F1 │ F │ 0 │ A1 │ 0 │ 0 │
│ L1 │ L │ 0 │ 0 │ M1 │ 0 │
│ M1 │ M │ 0 │ L1 │ C2 │ B2 │
│ C2 │ C │ C1 │ M1 │ 0 │ D2 │
│ D2 │ D │ D1 │ M1 │ 0 │ 0 │
│ B2 │ B │ B1 │ L1 │ C3 │ 0 │
│ C3 │ C │ C2 │ B2 │ 0 │ D3 │
│ D3 │ D │ D2 │ B2 │ 0 │ 0 │
└────┴───┴─────┴──────┴────┴───────┘
_