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

180

В рассматриваемом примере нам не пришлось сравнивать приоритеты двух операций, так как эти приоритеты уже заложены в правилах грамматики.

6.2 РАБОТА С ТАБЛИЦЕЙ СИМВОЛОВ

Поскольку синтаксические анализаторы обычно используют контекст-

но-свободную грамматику, необходимо найти метод определения контекст-

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

ношении способов употребления в программе значений различного типа.

Кроме того, в языках программирования имеются ограничения на употребле-

ние различных знаков. Для запоминания описанных идентификаторов и их типов большинство компиляторов использует таблицу символов [2].

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

В принятой формализации описание int x

является определяющей реализацией x, а использование x в дру-

гом контексте

x := 4 или x + y или read(y)

говорит, что имеется прикладная реализация x.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Во многих языках программирования один и тот же идентификатор может использоваться для представления в различных частях программы различных объектов (например, в «голове» – int, а в подпрограмме char). В

этом случае в таблице символов – это два разных объекта.

Таблица символов имеет ту же блочную структуру, что и сама про-

грамма, чтобы различать виды употребления одного и того же идентифика-

тора. При построении таблицы символов учитываются основные свойства большинства языков:

181

1)определяющая реализация идентификатора появляется раньше лю-

бой прикладной реализации;

2)все описания в блоке помещаются раньше всех операторов и пред-

ложений;

3)при наличии прикладной реализации идентификатора соответству-

ющая определяющая реализация находится в наименьшем включа-

ющем блоке, в котором содержится описание этого идентификатора;

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

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Пусть синтаксис описания идентификаторов задается правилами:

DEC real IDS | integer IDS | boolean IDS IDS ID

IDS IDS, ID

а блок определяется как

BLOCK begin DECS; STATS end,

где:

DECS DECS; DEC DECS DEC STATS STATS; stat STATS stat

В этом случае структуру таблицы символов можно представить в виде рис. 6.1.

182

levno

 

 

 

levno

 

 

 

levno

 

 

 

 

 

 

 

 

 

 

 

 

 

 

type

 

 

 

type

 

 

 

type

 

 

 

 

 

 

 

 

 

 

 

 

 

type

 

 

 

type

 

 

 

 

 

 

 

 

type

Рисунок 6.1 – Структура таблицы символов

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Таким образом, в любой точке разбора в цепи находятся те блоки, в ко-

торые делается текущее вхождение, а уже описанные идентификаторы по-

мещаются в список идентификаторов для того блока, где они описаны.

Для описания таблиц задаются структуры строго фиксированной кон-

фигурации. Обычно в этих структурах идентификаторы и типы представля-

ются целыми числами. Имеется указатель на элемент таблицы символов, со-

ответствующих наименьшему включающему блоку.

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

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

каждым элементом которого служит элемент этой таблицы символов.

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

лицы символов, соответствующие описаниям в этом блоке, удаляются из сте-

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

соответствующие всем текущим идентификаторам, находятся в стеке, а свя-

183

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

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Рассмотренный метод иллюстрируется следующим примером (табл.

6.2).

 

 

 

 

Таблица 6.2 – Стек с элементами таблицы символов

 

 

 

 

 

 

Вид программы

 

Элемент таблицы

 

 

 

 

 

 

Имя

Тип

 

 

 

 

 

begin

 

b

int

int a, b

 

a

int

 

 

 

 

 

 

 

 

 

 

 

 

 

begin

 

d

char

char c, d

 

c

char

 

 

 

b

int

 

 

 

a

int

 

 

 

 

 

 

 

 

 

 

 

 

 

end

 

b

int

 

 

 

a

int

 

 

 

 

 

begin

 

f

int

int e, f

 

e

int

 

 

 

b

int

 

 

 

a

int

 

 

 

 

 

begin

 

g

char

char g

 

f

int

 

 

 

e

int

 

 

 

b

int

 

 

 

 

 

184

 

a

int

 

 

 

 

 

 

 

 

end

f

int

 

e

int

 

b

int

 

a

int

 

 

 

end

b

int

 

a

int

end

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

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

ветствующем уровне в грамматике.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Контрольные вопросы по главе 6

·· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

1.Технология включения действий в грамматику.

2.Получение четверок, грамматика для четверок.

3.Разбор арифметического выражения с одновременной генерацией кода.

4.Метод определения контекстно-зависимых частей языка.

5.Синтаксис описания идентификаторов и блоков.

6.Структура таблицы символов.

7.Программная реализация таблицы символов.