Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция СП5.DOC
Скачиваний:
3
Добавлен:
28.04.2019
Размер:
384.51 Кб
Скачать

. Представление результатов сканирования

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

Во-первых, с целью семантического контроля исходного текста программы. Например, если в программе есть оператор вида

go to met,

то компилятор должен проверить , что идентификатор met встречается в программе в качестве метки соответствующего оператора ( а не в другом качестве).

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

a:= b+c,

то генерируемый код для операции “+” будет зависеть от атрибутов

идентификаторов b и c ( в частности, от типа a,b,c и т.п.)

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

Таблица

Класс лексемы

Внутреннее представление

Фактическое значение

Не определен

0

...

Идентификатор

1

...

Целое число

2

...

Действительное число

3

имена лексем

Знак операции

4

...

Зарезервированное слово

5

...

Вещественный массив

6

...

Метки

7

...

и т.д.

и т.д.

...

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

a:= b * c +0.15,

тогда после ее сканирования в таблице имен должна быть сформирована информация представленная на рис. 4.3.

Рис.

Дополнительная информация, связанная с каждой конкретной

лексемой, зависит от ее смыслового значения и может содержать большое количество атрибутов. Например, возможно, что для идентификатора надо знать его тип ( вещественный, целый, строковый и т.д.); был ли он меткой, именем процедуры, переменной, формальным параметром процедуры; должен ли он распределяться в статической или динамической памяти и т.д.

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

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

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

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