Пред.СтраницаСлед.Страница Раздел Содержание
5.4.7. Построение восходящих атрибутных преобразователей
Детерминированные атрибутные преобразователи могут работать не только
на основе нисходящего, но и на основе восходящего метода.
Особенность процедуры построения восходящих атрибутных
преобразователей заключается в том, что перевод, реализуемый такими
преобразователями должен быть задан в форме S-атрибутной грамматики,
которая определяется следующим образом.
Определение.
L-атрибутная грамматика в форме простого присваивания, у которой
все атрибуты нетерминальных символов являются синтезируемыми
атрибутами, |
Необходимость использования только
синтезируемых атрибутов вытекает из способа работы восходящего преобразователя,
соответствующего построению дерева вывода в направлению от листьев к корню
дерева, при котором передача наследуемых атрибутов оказывается невозможной.
Свойства L-атрибутной грамматики гарантируют, что в
правилах вычисления синтезируемых атрибутов нетерминала <X> не
используются другие синтезируемые атрибуты этого символа, и что в
правилах вычисления наследуемых атрибутов, находящихся
в правых частях правил грамматики, используются только атрибуты символов,
расположенных в правилах грамматики слева от символа с рассматриваемым
атрибутом.
В качестве примера приведем S-атрибутную грамматику,
построеннуую по грамматике Г 3. 14,
которая имеет вид:
Г5.7:
<E>%a ® <E>%b+T%c{СЛЕДУК}%d{СЛОЖИТЬ/x /y %z}
!! x = b; y = c; (a, z) = d;
<E>%g ® <T>%h
!! g = h;
<T>%k ® (<E>%l)
!! k = l;
<T>%n ® i/m
!! n = m;
Эта грамматика для выражения строит последовательность
атомов, атрибутами которых являются указатели на элементы
памяти, хранящие значения операндов и результата.Значения указателей
операндов передаются от терминалов i
через атрибуты нетерминальных символов на выход. Указатели на элементы
памяти, выделяемые для
промежуточных результатов, формируются символом действия с функцией
СЛЕДУК. Если задана постфиксная транслирующая грамматика в виде
S-атрибутной грамматики, и если входная грамматика заданной транслирующей
грамматики относится к подклассу грамматик, порождающих детерминированные
языки, например, к подклассу LR(0) или
SLR(1), то для нее можно построить детерминированный восходящий
атрибутный преобразователь. Такой преобразователь строится путем
расширения восходящего распознавателя цепочки входной грамматики.
Расширение заключается в том, что каждому грамматическому вхождению в стеке
выделяются дополнительные элементы памяти для хранения атрибутов. К
операциям свертки добавляются действия, связанные с вычислением значений
атрибутов, их записью в стек и удалением из стека, а к операциям переноса
добавляются действия записи атрибутов в стек.
Например, для грамматики Г5.7
операции Свертка(4) и Свертка(2) должны заключаться в замене символа,
находящегося в вершине стека. При выполнении операции Свертка(3)
необходимо прочитать 4 элемента из стека и сохранить значение третьего
элемента, соответствующего атрибуту l, затем записать в стек символ
<T> с атрибутом n, присвоить этому атрибуту значение l. Выполнение
операции Свертка(1) можно описать следующим образом:
1) выполнить действие {СЛЕДУК}%d и присвоить значение
атрибута d атрибуту z,
2) прочитать из стека символ n, его атрибут, а затем
присвоить значение этого атрибута атрибуту y,
3) удалить из стека один символ,
4) прочитать из стека символ и его атрибут, а
затем присвоить этот атрибут атрибуту x,
5) записать в стек символ <E> с одним атрибутом и присвоить
этому атрибуту значение атрибута с,
6) передать на выход атом {СЛОЖИТЬ/x /y %z}, атрибуты
которого определены.
Атрибутный преобразователь,
построенный для грамматики Г5.7,
должен работать в соответствии с таблицами переходов и
действий распознавателя (Табл. 3.4 и Табл. 3.5). Последователь
ность шагов, выполняемых атрибутным преобразователем при трансля ции входной
цепочки i5 + i7+- можно изобразить в следующем виде.
1. В исходном состоянии в стеке находится маркер
дна, а на входе - заданная цепочка.
Стек
Вход Выход
h0 i/5 + i/7 |-- -
2. По таблицам 3.4 и 3.5 находим, что
необходимо выполнить операцию переноса. В результате имеем:
Стек
Вход Выход
h0 5 i + i/7 |-- -
3. По таблицам определяем,
что следует выполнить операцию Свертка(4). Получаем:
.
Стек
Вход Выход
h0 5 T2 + i/7 |-- -
4. Следующей должна выполняться операция
Свертка(2).
Стек
Вход Выход
h0 5 Ex + i/7 |-- -
5. После выполнения
операции переноса имеем:
Стек
Вход Выход
h0 5 Ex + i/7 |-- -
6. Выполняя операцию переноса в стек символа
i с атрибутом
получаем:
.
Стек
Вход Выход
h0 5 Ex + 7 i |-- -
7. Согласно таблицам очередной операцией должна
быть Свертка(4), после выполнения которой имеем:
Стек
Вход Выход
h0 5 Ex + 7 T1 |-- -
8. По таблицам находим, что
следующей должна выполняться операция Свертка(1), поэтому, полагая,
что функция СЛЕДУК возвращает значение 22, имеем:
.
Стек
Вход Выход
h0 22 Ex |-- {СЛОЖ/5/7/22}
9. Входной символ, находящийся в вершине стека в соответствии с таблицами работы определяет выполнение операции Допустить, которая говорит об успешном завершении работы преобразователя.