- •3. Атрибутные транслирующие грамматики
- •3.1. Транслирующие грамматики
- •3.2. Атрибутные транслирующие грамматики
- •3.2.1. Синтезированные атрибуты
- •Рис 3.4
- •3.2.2. Унаследованные атрибуты
- •3.2.3. Определение атрибутной транслирующей грамматики
- •P2 p1
- •3.2.4. L- и s-атрибутные транслирующие грамматики
- •3.2.5. Форма простого присваивания
3.2.2. Унаследованные атрибуты
Термин "унаследованный" выражает ту мысль, что значение атрибута зависит от значений атрибутов предка символа или атрибутов его соседей в дереве вывода. Например, значение атрибута r символа {ОТВЕТ} равно значению атрибута нетерминала Е (соседа слева), порождающего все выражение. Оно может быть вычислено только после того как будут определены значения всех синтезированных атрибутов нетерминалов.
Рассмотрим еще один пример АТ-грамматики. На рис. 3.6, а приведена входная КС-грамматика G4, порождающая описания переменных в некотором языке программирования. Множество входных символов этой грамматики состоит из лексем: запятая, идентификатор i и имя типа t.
Семантика обработки описания заключается в занесении типа переменной в определенное поле элемента таблицы идентификаторов. Эту операцию можно выполнить с помощью семантической процедуры УСТАНОВИТЬ ТИП с двумя параметрами: указатель на элемент таблицы идентификаторов, соответствующий описываемой переменной, и тип переменной. Процедуру УСТАНОВИТЬ ТИП лучше всего вызывать сразу после распознавания идентификатора. Указанная последовательность действий может быть описана транслирующей грамматикой G4Т, приведенной на рис. 3.6, б, в которой вызову процедуры УСТАНОВИТЬ ТИП соответствует операционный символ {ТИП}.
(1) D t i L (1) D t i { ТИП } L
(2) L , i L (2) L , i { ТИП } L
(3) L (3) L
а б
Рис. 3.6
Введем в транслирующую грамматику G4Т атрибуты и правила их вычисления. Входные символы t и i имеют по одному атрибуту. Значением атрибута символа i является указатель на элемент таблицы идентификаторов, а атрибут символа t может принимать значения из множества { ЦЕЛЫЙ, ВЕЩЕСТВЕННЫЙ, ЛОГИЧЕСКИЙ }. Операционный символ {ТИП} должен иметь два унаследованных атрибута, значения которых совпадают со значениями соответствующих фактических параметров процедуры УСТАНОВИТЬ ТИП. Значения унаследованных атрибутов символа {ТИП} для первого правила вывода приравниваются значениям соответствующих атрибутов входных символов i и t, входящих в правую часть того же правила левее символа {ТИП}. Во второе правило тип описываемых переменных можно передать через унаследованный атрибут нетерминала L. Значение этого унаследованного атрибута будет передаваться по дереву сверху вниз, начиная с вершины, где он получает начальное значение, равное значению атрибута входного символа t.
Атрибутная транслирующая грамматика G4А приведена на рис. 3.7.
(1) D tr ia { ТИП }a1, r1 Lr2
a1 a
r1, r2 r
(2) Lr tr ia { ТИП }a1, r1 Lr2
a1 a
r1, r2 r
Lr
Рис. 3.7
(3)
Запись атрибутного правила в виде r1, r2 r означает, что значение r присваивается одновременно r1 и r2.
Входной цепочке tцелый i1, i2, i3 cоответствует дерево вывода в грамматике G4А, изображенное на рис. 3.8.
D
t целый i1 {ТИП} 1, целый L целый
, i2 {ТИП} 2, целый L целый
, i3 {ТИП} 3, целый L целый
Рис. 3.8
В рассмотренных примерах все операционные символы имели унаследованные атрибуты. При определении атрибутной транслирующей грамматики можно обойтись без синтезированных атрибутов операционных символов. Необходимость в синтезированных атрибутах операционных символов может возникнуть в некоторых практических реализациях переводов, поэтому в определение AT-грамматики включены оба типа атрибутов.