Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

9.1 Синтаксически управляемые определения

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

Атрибут может представлять собой все, что угодно, — строку, число, тип, адрес памяти и т.д. Значение атрибута в узле дерева разбора определяется семантическими правилами, связанными с используемой в данном узле продукцией.

Значение синтезируемого атрибута в узле вычисляется по значениям атрибутов в дочерних по отношению к данному узлах.

Значения наследуемых атрибутов определяются значениями атрибутов соседних (т.е. узлов, дочерних по отношению к родительскому узлу данного) и родительского узлов.

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

Дерево разбора, показывающее значения атрибутов в каждом узле, называется анно­тированным, а процесс вычисления значений атрибутов в узлах дерева— аннотирова­нием дерева разбора.

9.2 Вид синтаксически управляемого определения

В синтаксически управляемом определении каждая продукция грамматики А → α имеет связанное с ней множество семантических правил вида

b:=f1, с2, …,сk), где f — функция, с1 с2,…,ск — атрибуты грамматических символов продукции, а b — синтези­руемый атрибут символа А или наследуемый атрибут одного из грамматических симво­лов правой части продукции.

В любом случае атрибут b зависит от атрибутов с1, с2, …,сk.

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

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

Пример 30

На рис. 49 приведено синтаксически управляемое определение программы настоль­ного калькулятора. Это определение связывает с каждым из нетерминалов Е, T и F цело­численный синтезируемый атрибут vаl. Для каждой Е-, Т- и F-продукции семантическое правило вычисляет значение атрибута val нетерминала из левой части продукции по зна­чениям атрибутов нетерминалов правой части.

Продукция

Семантические правила

L E n

print(E.val)

E E1 + T

E.val := E1val + T.val

E T

E.val := T.val

T T1 * F

T.val := T1.val × F.val

T F

T.val := F.val

F ( E )

F.val := E.val

F digit

F.val : = digit.lexval

Рис. 49. Синтаксически управляемое определение простого калькулятора

Лексема digit имеет синтезируемый атрибут lexval, значение которого предоставляется лексическим анализатором. Правило, связанное с продукцией LEn для стартового нетерминала L, представляет собой процедуру вывода значения арифметического выражения, порождаемого E.

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