Синтезируемые и наследуемые атрибуты

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

Найти значение строки КС-языка можно, вычислив так на­зываемые атрибуты в каждом узле дерева ее разбора. Ат­рибуты вычисляют по формулам, связанным с правилами грам­матики языка. Атрибуты подразделяют на синтезируемые и на­следуемые.

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

Наследуемые атрибуты в некотором узле являются функциями атрибутов его узла-предка и (или) узлов-потомков этого предка. Такие атри­буты, как видим, могут распространять информацию в проти­воположном направлении.

Важно отметить, что КС-грамматика, снабженная атрибута­ми, сохраняет свои обычнее свойства и вместе с тем позволяет формально учесть контекстно-зависимые условия языка. А эле­менты контекстной зависимости присутствуют во всех языках программирования.

Рассмотрим суть синтезируемых атрибутов на при­мере, в котором синтаксический анализатор арифметических выражений выдает численное значение выражения. В этом про­стом примере операндами могут быть только константы. Т-грамматика выражений содержит единственный операционный сим­вол (обозначим его [ЗНАЧ]) и имеет вид:

1) S ->Е[ЗНАЧ] 2)Е->Е+Т 3)E->T $)T->T*F 5) T->F

6) F->(E) 7) F->C

где VN = {S, E, T, F},

VT = {+, *, (,), С},

S — аксиома;

С — константа, значение которой во внутреннем представлении построил лекси­ческий анализатор.

Возьмем строку (С3 + С9)*С2 в качестве входной для синтак­сического анализатора. В этом выражении подстрочными ин­дексами указаны значения констант, которые и будем считать их атрибутами. Построим дерево разбора активной цепочки (C3+ С9)*С2[ЗНАЧ]24 и снабдим нетерминалы (в узлах дерева) значениями синтезируемых атрибутов (рис. 5.3 а).

Значение выражения формируется из значений его подвыра­жений по правилам (формулам), соответствующим правилам грамматики. Представим эти формулы математически, для чего в каждом правиле грамматики предусмотрим различные имена для разных значений атрибутов, а затем запишем соответ­ствующие формулы. Атрибутом снабжается каждый нетерминал правила грамматики. Имена атрибутов обычно записывают как подстрочные индексы. Например, правилу Е > Е+ Т транслиру­ющей грамматики соответствуют правило Ер —> Eq+Tr и форму­ла р=- q + r. Обозначения атрибутов в различных правилах не имеют между собой ничего общего и могут быть одинаковыми.

Рисунок 5.3 - а) Дерево разбора активной цепочки (С39)*С2[ЗНАЧ]24

б) АТ-грамматика арифметических выражений

 

Полученные таким образом правила называют атрибутными, а грамматику с атрибутными правилами и формулами для атри­бутов — атрибутной транслирующей грамматикой (АТ-грамматикой). Атрибутная транслирующая грамматика для нашего примера дана на рис. 5.3 б. Заметим, что атрибут операционного символа [ЗНАЧ] не относится к числу синтезируемых, он — на­следуемый.

Теперь поясним смысл наследуемых атрибутов на примере, в котором синтаксический анализатор описания переменных по­мещает признак типа (real, int или boot) имени в соответствующее поле таблицы имен.

Пусть Т-грамматика описания переменных имеет вид:

1) описание —> Т V [тип] список

2) список —>, V [тип] список

3) список —>

В этой грамматике символы "описание", "список*' — нетерми­налы( VN); Т, V,, — терминалы (VT), [тип] — операционный символ, где V — символ класса имен со значением, представлен­ным указателем на элемент таблицы имен; Т— символ класса клю­чевых слов со значением, представленным указателем на real, int или bool. Запятая (,) — символ класса ограничителей. Операци­онный символ [тип] располагается в правилах вслед за именем V и предписывает поместить признак типа Т в поле "тип" записи переменной V таблицы имен. Поэтому значение [тип] определя­ется парой атрибутов (указ, тип), где "указ" — указатель на за­пись V в таблице имен, "тип" — значение Т.

Введем атрибуты и формулы для их вычисления в грамматику описания переменных. Будем использовать имена ti, где i = 0, 1, 2,..., для обозначения атрибута "тип" (значение Т), именами pi обозна­чим атрибут "указатель" (значение V). Для передачи типа перемен­ной из правила 1 в последующие снабдим нетерминал "список" атри­бутом типа. Тогда АТ-грамматика описания переменных может вы­глядеть так:

1) описание —> Tr0 Vp0 [тип]р1,r1 список t2

t2,t1 = t0;p1 =p0

2) cnucoкr0 -> , Vp0 [min]p1,t1 списокt2

t2,t1 = t0; р1 =р0

3)списокr0 ->

Формула t2, t1 = t0 означает, что атрибуты t2 и t1 получают значение атрибута t0. Согласно формуле р1 = р1 атрибут р1 по­лучит значение атрибута р0.

Возьмем в качестве примера описание real a, c1, abc. Синтак­сический анализатор получит входную строку, которая в наших обозначениях выглядит так: Treal V1, V2 V3. Здесь 1, 2, 3 — номера позиций имен в таблице имен. Построим дерево разбора (рис. 5.1.4) соответствующей активной цепочки

Рисунок 5.4 - Дерево разбора активной цепочки

Как видно из рассмотренных примеров, информация о синтези­руемых атрибутах распространяется вверх по дереву (см. рис. 5.3), а информация о наследуемых — вниз по дереву (рис. 5.4).

 








Дата добавления: 2016-03-27; просмотров: 548;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.